函数/Function:
1.0 定义:
函数在python是什么东西?
函数是组织好的,可以重复调用的,用来实现单一或相关功能的代码模块。
其实函数就是对象,python里面一切皆对象。
2.0 功能:
2.1 提供工作效率,避免重复的写相同的代码。你已经知道Python提供了许多内建函数,比如print()。但你也可以自己创建函数,这被叫做用户自定义函数。
2.2 方便修改,容易扩展
2.3 保持代码的一致性
3.0 python 内置函数:用for就可以把python内置的函数遍历出来。
from keyword import kwlist for i in kwlist: print(i) #执行结果: False None True and as assert async await break class continue def del elif else except finally for from global if import in is lambda nonlocal not or pass raise return try while with yield
4.0 定义一个函数:
4.1 函数是以def开头,然是标志符与(),def = define 定义
def function(): print(function())
4.2 任何参数都是写在()里面的
4.3 函数内容以冒号起始,并且缩进。
4.4 return 结束
def hello_rollo(x,y,z): print("Hello World,Rollo",x,y,z) return hello_rollo(1,2,3) #执行结果: Hello World,Rollo 1 2 3
5.0 函数命名规范:
5.1 函数名必须以下划线或字母开头,可以包括任意字母。数字或下划线的组合,不能使用任何的标点符号
5.2 函数名是区分大小写的
5.3 函数名不能是保留字
6.0 函数的参数:
6.1 函数分形参与实参两种
6.1.1 形参:形式参数,不是实际存在,是虚拟变量,在定义函数和函数体时使用形参,日的是在函数调用时接收实参。(实参个数一一对应)
6.1.2 实参:实际参数,调用函数时传给函数的参数,可以是常量,变量,表达式,函数,传给形参
def show_me(a,b): print(a + b) show_me(1,2) #执行结果: 3
6.2 必须参数:
必需参数须以正确的顺序传入函数。调用时的数量必须和声明时的一样。必须一一对应。
def show_me(name,age): print("name=",name) print("age=", age) show_me("rollo",18) #执行结果: name= rollo age= 18
我们换一个顺序:
def show_me(name,age): print("name=",name) print("age=", age) show_me(18,"rollo") #执行结果: name= 18 age= rollo
6.3 关键字参数:
关键字参数和函数调用关系紧密,函数调用使用关键字参数来确定传入的参数值。
使用关键字参数允许函数调用时参数的顺序与声明时不一致,因为 Python 解释器能够用参数名匹配参数值。
def show_me(name,age): print("name=",name) print("age=", age) show_me(age=18,name="rollo") #执行结果: name= rollo age= 18
6.4 默认参数
用函数时,如果没有传递参数,则会使用默认参数。
def show_me(name,age,sex ="male"): print("name=",name) print("age=", age) print("sex=", sex) show_me(age=18,name="rollo") #执行结果: name= rollo age= 18 sex= male
6.5 不定长参数
下面是定长参数,只能一次单一的功能。
def add(x,y): print(x+y) add(1,2) #执行结果: 3
不定长参数用*args
def add(*args): print(args) add(1,2,3) #执行结果: (1, 2, 3)
def add(*args): print(args) #得到一元组,打印 sumable = 0 for i in args: #遍历这个元组,求和 sumable += i print(sumable) add(1,2,3) #执行结果: (1, 2, 3) 6
def print_info(name,age,sex): print("Name:%s" % name) print("Age:%d" % age) print("Sex:%s" % sex) print_info("rollo",18,"male") #执行结果: Name:rollo Age:18 Sex:male
以上代码,如果我再想加个job= “python”的信息,这个函数就做不到了,这时用**来接收命名参数,接收为字典:
def print_info(*args,**kwargs): print(args) print(kwargs) print_info("rollo",18,"male",job="python",hobby="girls") #执行结果: ('rollo', 18, 'male') {'job': 'python', 'hobby': 'girls'}
def print_info(*args,**kwargs): print(kwargs) for i in kwargs: print("%s:%s" % (i,kwargs[i])) print_info(job="python",hobby="girls",know="help") #执行结果: {'job': 'python', 'hobby': 'girls', 'know': 'help'} job:python hobby:girls know:help
未命名参数用*args接收,有命名的用**kwargs接收,可以不断加参数,函数扩展性很强。
def student_info(*args,**kwargs): pass student_info(1,2,3,[123,5],name="rollo",age=18)
*args,**kwargs是有顺序的。
先默认参数,再未命名,后有命名
student_info(1,age=18,2,3,[123,5],name="rollo") #这样是不行的
7.0 匿名函数:lambda
8.0 return语句
return [表达式] 语句用于退出函数,选择性地向调用方返回一个表达式
9.0 变量作用域
Python 中,程序的变量并不是在哪个位置都可以访问的,访问权限决定于这个变量是在哪里赋值的。
变量的作用域决定了在哪一部分程序可以访问哪个特定的变量名称。Python的作用域一共有4种,分别是:
-
L (Local) 局部作用域
-
E (Enclosing) 闭包函数外的函数中
-
G (Global) 全局作用域
-
B (Built-in) 内置作用域(内置函数所在模块的范围)
以 L –> E –> G –>B 的规则查找,即:在局部找不到,便会去局部外的局部找(例如闭包),再找不到就会去全局找,再者去内置中找
9.1 global 和 nonlocal关键字
当内部作用域想修改外部作用域的变量时,就要用到global和nonlocal关键字了。