函数
def fun(形参): 定义函数
fun(实参) 执行函数
return 函数的返回值,遇到return不执行下面的代码,无return和直接写return返回的是None,返回值有多个时会放到元组里
'''
函数的注释 标明函数的作用以及每个值得意义 使用 函数名.__doc__ 即可查询该函数得注释值
'''
函数名 就是变量的功能加上()就能执行(也叫第一对象)
1、可以相互赋值
def fun()
print('123qwe')
f = fun
f()
2、可以当成函数的参数
def fun():
print('123')
def fun2(argc):
argc()
print('111')
fun2(fun)
3、可以当成容器类数据的参数
def fun():
print('123')
def fun2():
print('111')
def fun3():
print('3333333')
list1 = [fun, fun2, fun3]
for i in list1:
i()
4、可以当成函数的返回值
def fun():
print('123')
def fun2(argv):
print('111')
return argv #函数作为返回值
f = fun2(fun) #将函数名作为参数
f()
说明:此时的argv就是fun就是f f()实际上执行的是fun() 所以输出为:111 123
函数的传参
从实参角度传参顺序: 位置参数=》关键字参数
def func1(x, y, z):
print(x, y, z)
func1(1, 2, 3) #位置参数 必须一一对应
func1(x=1, y=2, z=3) #关键字参数可不分顺序
返回大数 三元运算符
def compare(a, b):
return a if a > b else b
或
print(a if a > b else b)
混合参数, 关键字参数必须在位置参数的后面。
def fun(argv1, argv2, argv3):
print(argv1)
print(argv2)
print(argv3)
fun(1, 2, argv3=3) #混合参数中位置参数一一对应,关键字参数必须在位置参数最后
从形参角度传参顺序: 位置参数=》*args=》默认参数=》**kwargs
1、位置参数 与实参角度一样,必须一一对应,位置参数必须传值
2、默认参数 默认参数必须在位置参数后面, 默认参数是个可变数据类型
当函数中有默认参数,那么实参使用默认的,如果写就覆盖默认参数。使用方法为sex = 'hhhh'(关键字传参法)
def register(name, sex='男'):
with open('register.txt', encoding='utf-8',mode='a') as fd:
fd.write('{},{}
'.format(name, sex))
while True:
print('q exit')
name = input('name=')
sex = input('sex=')
if name.upper() == 'Q':break
register(name) # 不传实参时 形参会自动使用默认参数
--------------------------------、
def default_param(a, l = []) # 默认参数是可变数据类型
l.append(a)
print(l)
default_param('hello')
default_param('world')
动态参数:fun(*args, **kwargs)万能参实
当函数的传的参数不定时使用。*args接收的是位置参数,包括空值也不会报错,并存放到元组。 **kwargs接收的是关键字参数,并存放到字典
def fun(*args, **kwargs):
print(args) #输出类型为元组(针对所有位置参数)
print(kwargs) #输出字典
fun(1, 2, 3, 4, 5, 6, 7,'alex', '老男孩', a='w', b='q', c='323')
输出:
(1, 2, 3, 4, 5, 6, 7, 'alex', '老男孩')
{'a': 'w', 'b': 'q', 'c': '323'}
打散、聚合功能,*将形参无论什么格式以单个元素放入元组中。 **将形参聚合到字典中 (不会看这个)
def fun(*args, **kwargs): #形参加*表示将传参聚合并放入一个元组中, 加**表示聚合到字典中
print(args)
print(kwargs)
list1 = [1, 2, 3, 4]
tupe1 = (1, 2, 3, 4)
list2 = ['alex', 'wuser', 4]
dic = {'qq':1, 'er':'wwe'}
fun(list1, *tupe1, *list2, cc = 4, **dic) #实参加 * 表示将位置参数迭代打散传入,作用域为 str tuple set list ** 表示将字典和关键字参数传入
输出:
([1, 2, 3, 4], 1, 2, 3, 4, 'alex', 'wuser', 4)
{'cc': 4, 'qq': 1, 'er': 'wwe'}
将dic 以*dic打散为实参传入 形参接受 到的是dic的key值
实参传入的字典key不能使用纯数字,因为传入的参数是当作变量使用的
python的名称空间
全局名命空间 临时名称空间 内置名称空间
运行py代码时,遇到一个变量时python会开辟一段空间,存的是 变量和值的指针的关系,如name与alix的id的关系,当print(name)时,会先找name然后再找对应关系,找到对应指针后重内存中找到alix并打印。
遇到函数时只是将函数的名字记录到内存空间,其内部如何根本不关心,在函数调用时,python会开辟一段空间将记录函数内部的变量和对应值指针的关系记录,函数中的变量只能在函数内部使用,随着函数结束这块内存也会消失。
代码的开始 创建的存储‘变量与值的关系’的空间叫全局名命空间(全局名命空间);
在函数的运行中开辟的临时的空间叫做局部名命空间(临时名称空间)
系统函数的是 内置名称空间
加载顺序 :内置名称空间-》全局名称空间-》局部名称空间
取值顺序: 局部名称空间-》全局名称空间-》内置名称空间
作用域:
全局作用域:全局名称空间 内置名称空间
局部作用域:临时名称空间
关键字: 注意如果不调用该函数,即使使用了global和nonlocal修饰 也不会起作用
#global 在任何作用域 改变一个全局变量 ,如global 修饰的变量名不存在 相当于新建一个全局变量
name = 'hello'
def fun():
global name 使用关键字后,调用函数后name变为全局变量
name = 'abc'
fun()
print(name)
输出: abc
#nonlocal 不能修改全局变量;只能在局部作用域中使用nonlocal,只改变当前作用域的变量,如过当前找不到就会像上层函数找,如果每层都找不到会报错。用的少 当py文件特别大时在嵌套过多时用
def fun():
name = '123'
print('qq%s'% name)
def fun2():
nonlocal name
name = 'abc'
print(name)
fun2()
print(name)
fun()
输出:
qq123
abc
abc
-----------------
a = 1
def fun_1():
a = 2
def fun_2():
global a
a = 3
def fun_3():
a = 4
print(a)
print(a)
fun_3()
print(a)
print(a)
fun_2()
print(a)
print(a)
fun_1()
print(a) 输出:1 2 3 4 3 3 1