一、函数

def 函数名(参数):

    ...
函数体
...
返回值

函数的定义主要有如下要点:

  • def:表示函数的关键字
  • 函数名:函数的名称,日后根据函数名调用函数
  • 函数体:函数中进行一系列的逻辑计算,如:发送邮件、计算出 [11,22,38,888,2]中的最大数等...
  • 参数:为函数体提供数据
  • 返回值:当函数执行完毕后,可以给调用者返回数据。

有参数实现

# def test(x):
# '''
# y=2*x+1
# :param x:整形数字
# :return: 返回计算结果
# '''
# y=2*x + 1
# return y
#
# a=test(3)
# print(a)

无参数实现

# def test():
# '''
# y=2*x+1
# :param x:整形数字
# :return: 返回计算结果
# '''
# x=3
# y=2*x + 1
# return y
#
# a=test()
# print(a)

函数的返回值

总结:
返回值数=0:返回None
返回值数=1:返回Object
返回值数>1:返回tuple

函数参数

    # def test(x,y,z): #x=1,y=2,z=3
    # print(x)
    # print(y)
    # print(z)
    # 位置参数,必须一一对应,缺一不行,多一也不行
    # test(1,2,3)
    # 关键字参数,无须一一对应,缺一不行多一也不行
    # test(y=1,x=3,z=2)
    # 混合使用位置参数必须在关键字参数左边
    # test(1,y=2,3) #报错
    # test(1,3,y=2) #报错
    # test(1,3,z=2)
    # test(1,3,z=2,y=4) #报错,y 传入了多个值

默认参数:

    # def handle(x,type='mysql'):
    # print(x)
    # print(type)
    # handle('hello')            #返回:hello mysql
    # # handle('hello',type='sqlite')   #返回:hello sqlite
    # # handle('hello','sqlite')

动态参数:参数组:**字典 *列表

  1)

    # def test(x,*args):
    # print(x)
    # print(args)
    # print(args[0][0])
    # test(1)
    # test(1,2,3,4,5,6)
    # test(1,{'name':'alex'})
    # test(1,['x','y','z']) #把列表当作一个整体传进去
    # test(1,*['x','y','z']) #遍历列表
    # test(1,*('x','y','z')) #遍历元祖
  2)
    # def test(x,**kwargs):
    # print(x)
    # print(kwargs)
    # test(1,y=2,z=3)
    # test(1,y=2,z=3,z=4) #会报错:一个参数不能传两个值,传值重复
  3)
    # def test(x,*args,**kwargs):
    # print(x)
    # print(args,args[-1])
    # print(kwargs,kwargs.get('y'))
    # # test(1,1,2,3,4,5,x=1,y=2,z=3) #报错
    # # test(1,1,2,3,4,5,y=2,z=3)
    # test(1,*[1,2,3],**{'y':1})

二、全局变量与局部变量

代码规范:全局变量变量名都大写,局部变量变量名都小写
     全局变量顶头写
    # 当全局变量与局部变量同名时:
    # 在定义局部变量的子程序内,局部变量起作用;在其它地方全局变量起作用
name = 'lyj'

def change_name():
print('我的名字',name) change_name()

    返回:我的名字 lyj

name = 'lyj'
def change_name():
name='甩了一比'
print('我的名字',name) change_name()
print(name)

    返回:

      我的名字 甩了一比
      lyj

name = 'lyj'
def change_name():
global name #引用全局变量,声明成全局变量了,其他函数的name也变成 甩了一比了
            # global name : global 用于将局部变量声明成全局变量
    name = '甩了一比'
print('我的名字', name) change_name()
print(name)

    返回:

      我的名字 甩了一比
      甩了一比


# 如果函数内部无 global 关键字,优先读取局部变量,只能读取全局变量,无法对全局变量重新赋值 name='adfga',
# 但是对于可变对象,可以对内部元素进行操作,name.append("afgadgs")
# 如果函数内部有 global 关键字,变量本质上就是全局的那个变量,可读取可赋值 name='adgc' # 如果函数内部无 global 关键字,
# - 有声明局部变量
# name = ["Q","W"]
# def fuck():
# name = "R"
# print("fuck",name)
# fuck()
# - 无声明局部变量
# name = ["Q","W"]
# def fuck():
# name.append("T") #列表的方法都可以用
# print("fuck",name)
# fuck()
# 如果函数内部有 global 关键字,
# - 有声明局部变量
# name = ["Q","W"]
# def fuck():
# global name
# name = "R"
# print("fuck",name)
# fuck() # 错误示例:
# name = ["Q","W"]
# def fuck():
# name = "R"
# global name #全局变量声明要往上提
# print("fuck",name)
# fuck()
# - 无声明局部变量
# name = ["Q","W"]
# def fuck():
# global name
# name = "Y"
# name.append("T") #列表的方法都可以用
# print("fuck",name)
# fuck()   

关于 global 和 nonlocal 参考: https://www.cnblogs.com/z360519549/p/5172020.html

三、递归

#递归调用是函数嵌套调用的一种特殊形式,函数在调用时,直接或间接调用了自身,就是递归调用,在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口。

递归的两个阶段:回溯,递推
   回溯就是从外向里一层一层递归调用下去,
回溯阶段必须要有一个明确地结束条件,每进入下一次递归时,问题的规模都应该有所减少(否则,单纯地重复调用自身是毫无意义的) 递推就是从里向外一层一层结束递归
import  time
def calc(n):
print(n)
time.sleep(1)
calc(n) calc(10)

递归例子:

import time

person_list=['alex','wupeiqi','linhaifeng','zsc']
def ask_way(person_list):
print('-'*60)
if len(person_list) == 0:
return '根本没人知道'
person=person_list.pop(0)
if person == 'linhaifeng':
return '%s说:我知道,老男孩就在沙河汇德商厦,下地铁就是' %person print('hi 美男[%s],敢问路在何方' % person)
print('%s回答道:我不知道,但念你慧眼识猪,你等着,我帮你问问%s...' % (person, person_list))
time.sleep(1)
res=ask_way(person_list) print('%s问的结果是: %res' %(person,res))
return res res=ask_way(person_list)
print(res)

返回结果:

D:\Python35\python3.exe D:/python_s3/day15/.py
------------------------------------------------------------
hi 美男[alex],敢问路在何方
alex回答道:我不知道,但念你慧眼识猪,你等着,我帮你问问['wupeiqi', 'linhaifeng', 'zsc']...
------------------------------------------------------------
hi 美男[wupeiqi],敢问路在何方
wupeiqi回答道:我不知道,但念你慧眼识猪,你等着,我帮你问问['linhaifeng', 'zsc']...
------------------------------------------------------------
wupeiqi问的结果是: 'linhaifeng说:我知道,老男孩就在沙河汇德商厦,下地铁就是'es
alex问的结果是: 'linhaifeng说:我知道,老男孩就在沙河汇德商厦,下地铁就是'es
linhaifeng说:我知道,老男孩就在沙河汇德商厦,下地铁就是

(五)、python 函数的更多相关文章

  1. 十五. Python基础(15)--内置函数-1

    十五. Python基础(15)--内置函数-1 1 ● eval(), exec(), compile() 执行字符串数据类型的python代码 检测#import os 'import' in c ...

  2. [Python学习笔记][第五章Python函数设计与使用]

    2016/1/29学习内容 第四章 Python函数设计与使用 之前的几页忘记保存了 很伤心 变量作用域 -一个变量已在函数外定义,如果在函数内需要修改这个变量的值,并将这个赋值结果反映到函数之外,可 ...

  3. python学习三十五天函数递归的用法

    python函数递归就是自己调用自己,无限循环,但是python限制了调用的次数1000次,就会终止,递归用在栏目分类,采集程序比较多,下面简单说函数递归用法和实例 1,函数递归用法 def func ...

  4. Python入门笔记(18):Python函数(1):基础部分

    一.什么是函数.方法.过程 推荐阅读:http://www.cnblogs.com/snandy/archive/2011/08/29/2153871.html 一般程序设计语言包含两种基本的抽象:过 ...

  5. 四年级--python函数基础用法

    一.函数的定义,调用和返回值 1.1 语法 def 函数(参数一,参数二...): ''' 文档注释 ''' 代码逻辑一 代码逻辑二 .... return 返回值 1.2 定义函数的三种形式 说明: ...

  6. Python函数的定义、参数传入与函数的调用

    作为计算机代码的一种抽象方式,函数在Python中扮演了极为重要的角色.今天给大家介绍Python函数的定义.参数的传入以及调用方式.其中函数参数的传入方式为本节重点内容.Python函数的参数形式包 ...

  7. 二十五. Python基础(25)--模块和包

    二十五. Python基础(25)--模块和包 ● 知识框架   ● 模块的属性__name__ # my_module.py   def fun1():     print("Hello& ...

  8. python:函数中五花八门的参数形式(茴香豆的『回』字有四种写法)

    毫不夸张的说,python语言中关于函数参数的使用,是我见过最为灵活的,随便怎么玩都可以,本文以数学乘法为例,演示几种不同的传参形式: 一.默认参数 def multiply1(x, y): retu ...

  9. 《转》Python学习(17)-python函数基础部分

    http://www.cnblogs.com/BeginMan/p/3171977.html 一.什么是函数.方法.过程 推荐阅读:http://www.cnblogs.com/snandy/arch ...

  10. 【290】Python 函数

    参考:Python 函数 参考:7.3 给函数参数增加元信息(增加参数的数据类型) 目录: 一.语法 二.说明 三.参数传递 四.参数 4. 1 必备参数 4.2 关键字参数 4.3 缺省参数 4.4 ...

随机推荐

  1. CSS动画效果

    CSS变形效果 Transform translate:平移 translate(x,y) translateX(x) translateY(y)相对于元素原始位置平移. scale:缩放 大于1放大 ...

  2. 【Android】6.0 添加Menu菜单组件、Intent启动活动、显式Intent、隐式Intent

    1.0 在helloworld项目基础上创建活动SecondActivity: 2.0 其中main.xml: <?xml version="1.0" encoding=&q ...

  3. 使用git版本管理工具

    1.(1)正常提交:git add 提交文件 git init   //git init之后建立一个.gitignore可以避免node_modules这类文件夹提交 git add . git co ...

  4. linux 服务注册 service文件 在service文件中设置变量和环境变量

    [Unit] Description=  #服务描述 After=syslog.target     #服务启动依赖 [Service] Type=forking          #服务启动类型 可 ...

  5. java面试题之----super和this

    super和this的异同: super(参数):调用基类中的某一个构造函数(应该为构造函数中的第一条语句) this(参数):调用本类中另一种形成的构造函数(应该为构造函数中的第一条语句) supe ...

  6. vmware克隆的linux机器网络不通

    当我使用vmware的完全克隆功能克隆出两台虚拟机之后,登录发现网络不通,仔细检查发现几个问题,由于克隆之后默认的eth0网卡在系统中会变成eth1,导致之前的eth0网卡配置信息无法加载,网络不通, ...

  7. 实验:将系统进程映射移到 Python 字典中

    参考官方文档,测试下列代码,把oracle的进程映射到python的字典中: [oracle@ycr python]$ more pro_get.py import reimport subproce ...

  8. 一、Python安装下载

    下载地址:https://www.python.org/downloads/ 因为Python3.X和2.X有部分不兼容,有些不向下兼容,现在3.5的资料和插件少,故我就学习的2.7.11了; 下载后 ...

  9. cblas_sgemm cblas.h

    BLAS(Basic Linear Algebra Subprograms)库,是用Fortran语言实现的向量和矩阵运算库,是许多数值计算软件库的核心, 但也有一些其它的包装, 如cblas是C语言 ...

  10. 使用vba doc转docx

    创建vbs文件,doctodocx.vbs内容如下: '创建一个word对象 set wApp=CreateObject("word.Application") '获取文件传递到参 ...