5.3参数
1.基本参数知识
-
任意参数
-
任意类型
def func(a1,a2,a3):
print(a1,a2,a3)func(1,"asdf",True)
2.位置传参(调用函数并传入参数)【执行】
def func(a1,a2,a3):
print(a1,a2,a3)
func(1,3,4)#a1=1,a2=3,a3=4
3.关键字传参【执行】
def func(a1, a2):
print(a1, a2)
func(a2=99,a1=2)
# 关键字传参数和位置传参可以混合使用(位置传入的参数 > 关键字参数在后 = 总参数个数)
def func1(a1, a2, a3):
print(a1, a2, a3)
# func(1, 2, a3=9)
# func(1, a2=2, a3=9)
# func(a1=1, a2=2, a3=9)
# func(a1=1, 2,3) # 错误
4.默认参数【定义】
def func(a1,a2,a3=9,a4=10):
print(a1,a2,a3,a4)
func(11,22)
func(11,22,10)
func(11,22,10,100)
func(11,22,10,a4=100)
func(11,22,a3=10,a4=100)
func(11,a2=22,a3=10,a4=100)
func(a1=11,a2=22,a3=10,a4=100)
5.万能参数【也叫打散】
- *args
- 可以接受任意个数的位置参数,并将参数转换成元组。
-
调用函数无*
def func(*args):
print(args)func(1,2,3,4)#带列表,集合,字典,结果出来都是元祖
-
调用函数有*
def func(*args):
print(args)func(*(1,2,3,4)) func(*[1,2,3,4])#结果直接是元祖(1,2,3,4)
-
只能用位置传参
def func(*args):
print(args)func(1)
func(1,2)
func(1,2) # args=(1, 2)
func((11,22,33,44,55)) # args=((11,22,33,44,55),)
func(*(11,22,33,44,55)) # args=(11,22,33,44,55)
-
- **kwargs
- 可以接受任意个数的关键字参数,并将参数转换成字典。
- 调用函数无 **
def func(**kwargs):
print(kwargs)
func(k1=1,k2="alex")
- 调用函数有**
def func(**kwargs):
print(kwargs)
func(**{'k1':'v2','k2':'v2'}) # kwargs={'k1':'v2','k2':'v2'}
-
只能用关键字传参
-
综合应用:无敌 + 无敌 => 真无敌
def func(args,**kwargs): print(args,kwargs)
# func(1,2,3,4,5,k1=2,k5=9,k19=999)func([1,2,3],k1=2,k5=9,k19=999)func([1,2,3],**{‘k1’:1,‘k2’:3})func(111,222,[1,2,3],k11=‘alex’,**{‘k1’:1,‘k2’:3})
def old(a, b, c, *args, **kwargs):
print(a, b, c) # 5 2 1
print(args) # ()
print(kwargs) # {‘y’: 3, ‘q’: 1, ‘w’: 3}old(5, c=1, b=2, y=3, q=1, w=3)
- 参数相关重点:
1.定义函数
def func1(a1,a2):
pass
def func2(a1,a2=None):
pass
def func3(*args,**kwargs):
pass
2.调用函数
位置参数>关键字参数
5.4作用域
名称空间
- 加载顺序
1.内置空间
2.全局空间
3.局部空间 - 取值顺序
1.局部空间
2.全局空间
3.内置空间
作用域
-
1.全局作用域 内置空间+全局空间
-
2.局部作用域 局部空间
-
py文件:全局作用域
-
函数:局部作用域
a = 1
def s1():
x1 = 666
print(x1)
print(a)
print(b)b = 2 print(a) s1() a = 88888 def s2(): print(a,b) s1() s2()
-
一个函数一个作用域
def func():
x = 9
print(x)
func()
print(x) -
作用域中查找数据规则:优先在自己的作用域找数据,自己没有就去 “父级” -> “父级” -> 直到全局,全部么有就报错。注意:父级作用域中的值到底是什么?
x = 10
def func():
x = 9
print(x)func()
-
global
声明全局变量,如果全局中存在就使用,不存在就会创建
def func():
global a
a = 3
func()
print(a) # 3count = 1
def search():
global count
count = 2
search()
print(count) # 2
对可变数据类型(list,dict,set)可以直接引用不用通过global。 -
nonlocal
在局部作用域中,对父级作用域(或者更外层作用域非全局作用域)的变量进行引用和修改,并且引用的哪层,从那层及以下此变量全部发生改变。如果找不到就会报错
def add_b():
b = 42
def do_global():
b = 10
print(b)
def dd_nonlocal():
nonlocal b
b = b + 20
print(b)
dd_nonlocal()
print(b)
do_global()
print(b)
add_b() # 10 30 30 42
-
5.5函数的嵌套
-
第一种
def max2(x,y):
m = x if x>y else y
return mdef max4(a,b,c,d): res1 = max2(a,b) res2 = max2(res1,c) res3 = max2(res2,d) return res3 max4(23,-7,31,11) # 31
-
第二种
def f1():
print(“in f1”)
def f2():
print(“in f2”)
f2()f1() # in f1 in f2 ########### def f1(): def f2(): def f3(): print("in f3") print("in f2") f3() print("in f1") f2() f1() # in f1 in f2 in f3
练习题
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# x = 10
# def func():
# x = 9
# print(x)
# def x1():
# x = 999
# print(x)
#
# func()
# x = 10
# def func():
# x = 9
# print(x)
# def x1():
# x = 999
# print(x)
# x1()
#
# func()
# x = 10
# def func():
# x = 9
# print(x)
# def x1():
# x = 999
# print(x)
# print(x)
# x1()
#
# func()
# x = 10
# def func():
# x = 8
# print(x)
# def x1():
# x = 999
# print(x)
# x1()
# print(x)
#
# func()
# x = 10
# def func():
# x = 8
# print(x)
# def x1():
# print(x)
# x1()
# print(x)
#
# func()
# x = 10
# def func():
# x = 8
# print(x)
# def x1():
# print(x)
# x = 9
# x1()
# x = 10
# print(x)
#
# func()
#
# x = 10
# def func():
# x = 8
# print(x)
# def x1():
# print(x)
#
# x1()
# x = 9
# x1()
# x = 10
# print(x)
#
# func()