目录
1.1函数的参数
1.1.1可变参数
1.1.1.1 *args
定义形参时,在形参前面加 * 号 , 这种形参就可以获得所有的位置实参,将所有的实参都保存到一个 元组中 ★
* : 可以接收所有的实参,并且将实参保存到一个元组中
装包:散开的数据,装到一个元组或字典
def fn(*a):# 将任意个位置参数装成元组
print('a =',a)
fn(1,2,3)
def su(*a):
res = 0
for i in a:
res += i
print(res)
su(1)
su(1,2)
su(1,2,3)
1.带 * 号的形参 只能有一个
2.纯位置参数,带 * 号的参数可以和其他参数混合使用,但是得写最后面
# 使用关键字参数可以解决第二个问题
3.带*参数的名字,取名一般叫 *args
1.1.1.2 **kwargs
def fn(**kwargs):
print('kwargs =', kwargs)
print(type(kwargs))
fn(a=1, b=2, c=3)
》**形参可以接收任意的关键字参数,会将这些参数统一保存到字典里面。字典的键就是参数的名字,字典值就是参数的值
》**形参也是只能有一个,并且写在所有参数最后,它必须是最后一个。潜规则命名:**kwargs
1.1.2 参数解包
》 传递实参时,也可以在序列类型的参数前添加星号,这样会自动将序列中的元素依次作为参数传递
def fn(a, b, c):
print('a =', a)
print('b =', b)
print('c =', c)
t = (1, 2, 3)
# fn(*t) <==> fn(1,2,3)
fn(*t) # 实参可以接收任意类型
# 使用解包时候,注意保持序列元素,能够被对应形参接收
def fn(a, b, c):
print('a =', a)
print('b =', b)
print('c =', c)
d = {'a': 10, 'b': 20, 'c': 30}
fn(**d) # 实参可以接收任意类型
字典的名字必须得和 形参名字相同
序列类型可以解包赋值 =》 得对应数目
1.2 函数返回值
返回值:函数执行以后返回的结果
可以通过 return 来指定函数的返回值
获得返回值的方法:把函数的调用当作一个值
score = [10,20,30,40,50,60]
x = sum(score)
print(f'老师的总分 {x//10}')
return 后面是什么 函数返回结果就是什么
return 后面可以是任意的值
return 只能返回单值
def fn():
return 1,2,3 # 看似返回多个值,其实也是一个元组
x = fn()
print(x)
# 返回值是函数
def fn():
def fn2():
print('h')
return fn2
r = fn() # r = fn2
r()
★★★
fn()两种函数:
1.调用函数
2.接收的返回值
None:代表空值
Python中None是一个特殊的常量(N必须是大写)
# 如果仅仅写一个return,或者说不写reutrn 则等价于 return None
# return代表函数执行结束,后面代码不会再执行
break:退出当前循环
continue:跳过本次循环
return:结束整个函数
fn 和 fn() 的区别
print(fn) # fn是函数对象
print(fn()) #执行fn的代码, 输出返回值
1.3 作用域与命名空间
1.3.1 作用域
作用域:指变量的生效的区域
y = 2
def fn():
x = 1
print('函数内部y =',y)
fn()
print("函数外部y =",y)
python作用域一共有两种
1.全局作用域
2.函数作用域
1.3.1.1 全局作用域
全局作用域生命周期:全局作用域在程序执行时创建,在程序执行结束时销毁
》所有函数以外的位置 都是全局作用域
》在全局作用域中定义的变量,都属于全局变量,全局变量可以在程序任意位置访问
1.3.1.2 函数作用域
函数作用域生命周期:函数调用的时候出生,调用结束的时候销毁
def fn():
a = 10
print('a =',a)
fn()
fn()
fn()
一共诞生了3次函数作用域
函数作用域中定义的变量,只能函数内部范围
def fn():
a = 10
print('内部a =',a)
print('外部a =',a)
★★★
变量的查找规则:会优先在当前作用域中寻找该变量,如果有就使用,没有则继续往上一级作用域寻找,如果全局都没有,就报错
希望在函数内部修改全局变量,则需要使用 global关键字来声明变量
x = 20
def f():
global x # 声明之后,x就是全局变量
x = 100
f()
print(x)
nonlocal用来在嵌套函数中使用外层(非全局)变量
def f():
x = 20
def g():
nonlocal x
x += 1
g()
print(x)
f()
1.3.2 命名空间
命名空间:变量存储的位置,每一个变量都需要存储到命名空间中
全局作用域 =》全局命名空间 =》全局变量
函数作用域 =》函数命名空间 =》局部变量(或者说是函数中的变量)
命名空间 =》专门存储变量字典
locals(): 获取当前作用域的命名空间。
如果在全局作用域中调用 locals(),获得全局的命名空间
如果在函数作用域中调用 locals(),获得函数的命名空间
x = 1
print(locals()) # 全局命名空间
a = 1
def fn():
b = 1
print(locals()) # 函数命名空间
fn()
1.4 练习
# 注意:前三题要求是 返回值
1.编写一个函数,功能是返回2个数的和
2.编写一个函数,功能是返回任意个数的和
3.编写一个函数cacluate, 可以接收任意多个数,返回的是一个元组.
元组的第一个值为所有参数的平均值, 第二个值是大于平均值的所有数
4.
'''
请在下列代码的 四个print后面
注释分别写上 变量的作用域类型 和 结果值
如
print(b) # 全局作用域 100
'''
a = 5
c = 20
x = 100
def test(a, b=10):
print(a) # 函数作用域 1
print(b) # 函数作用域 2
print(x) # 全局作用域 100
c = 50
c += 1
print(c) # 函数作用域 51
test(1, 2)
print(c) # 全局作用域 20
1.5 答案解析
# 1.编写一个函数,功能是返回2个数的和
def sum_1(x,y):
sum=x+y
return sum
r=sum_1(5,7)
print(r)
# 2.编写一个函数,功能是返回任意个数的和
def sum_2(*args):
res=0
for i in args:
res+=i
return res
scy=sum_2(1,2,3,7)
print(scy)
# 3.编写一个函数cacluate, 可以接收任意多个数,返回的是一个元组.
# 元组的第一个值为所有参数的平均值, 第二个值是大于平均值的所有数
def cacluate(*args):
list=[]
sum=0
for i in args:
sum+=i
avg=sum/len(args)
for i in args:
if i>avg:
list.append(i)
return avg,list
scy1=cacluate(1,2,3,4,5,6,7,8,9,10)
print(scy1)
# 4.
'''
请在下列代码的 四个print后面
注释分别写上 变量的作用域类型 和 结果值
如
print(b) # 全局作用域 100
'''
a = 5
c = 20
x = 100
def test(a, b=10):
print(a) #---------函数作用域 1
print(b) #---------函数作用域 2
print(x) #---------全局作用域 100
c = 50
c += 1
print(c) #---------函数作用域 51
test(1,2)
print(c) #------------结果 20