10 动态参数 命名空间和作用域 global.nonlocal
1. 动态参数
位置参数的动态参数
def chi(*food):
print("我要吃",food)
chi("小米粥","绿豆粥","八宝粥") #多个参数传递进去,收到的是元祖tuple
def func(a,b,c,*args,d=5):
print(a,b,c,d,args)
func(1,2,3)
func(1,2,3,4,56,7)
func(1,2,3,4,5,6,7,"马大哈")
关键字参数的动态参数
def func(**food): # **food动态接收关键字参数
print(food) # 接收到的是字典
func(good_food="盖浇饭", bad_food="辣条", drink="冰封") #结果是我要吃 {'good_food': '火锅', 'bad_food': '快餐'}
顺序:位置参数,*args,默认值,**args
这个函数可以接受所有的参数(无敌)
可以接收所有的参数(无敌的)
def func(*args, **kwargs):
print(args)
print(kwargs)
func(1, 2, 5, 6, name="taibai",age=18, sex="不详")
在形参上*聚合,**聚合;在实参上*打散,**打散.
# 把列表中的每一个元素作为参数, 传递给函数. 一次都传过去
def func(*args,**kwargs): #*表示聚合,所有的位置参数,聚合成元祖
print(args)
print(kwargs)
lst = ["马虎疼","大眼哥","小花生","毛尖妹妹"]
func(*lst) #实参打散,迭代产生的. #结果是('马虎疼', '大眼哥', '小花生', '毛尖妹妹')
def func(*args,**kwargs): #**表示聚合成字典
print(args)
print(kwargs)
dic={"name":"太白","alex":"wusir"}
func(**dic) #将字典打散,以key:value的形式进行传参.
给函数传递任意个整数,返回和.
#给函数传递任意个整数,返回和 # def func(*n): # s = 0 # for i in n: # s = s + i # return s # print(func(1,3,5,6,8))
注意点:
def func(*args, **kwargs):
# args = (1,2,3) #接收的是元祖
#kwargs = {'name':'alex,'age':23} #接受的是字典
print(*args) # print(*(1,2,3)) #print(函数中有*args对象) 打印1,2,3
print(**kwargs) # print(**{'name':'alex', 'age':1000}) #print(函数中没有**args对象) 报错
# 当定义一个函数的时候:* 代表 聚合.
# 当执行一个函数的时候:* 代表 打散.
func(1, 2, 3, name='alex', age=1000)
2. 命名空间和作用域:
命名空间:
1.内置命名空间:python解释器内部运行时的变量函数
2.全局命名空间:我们在py文件中直接声明出来的变量,函数
3.局部命名变量:在函数内部声明的变量和函数
作用域:
1.全局作用域:内置+全局
2.局部作用域:局部
globals()查看全局作用域中的名字
locals()查看当前作用域中的名字
a = 10
def func():
a = 20
print(a)
print(globals()) #globals() 获取到全局作用域(内置,全局)中的所有名字
print(locals()) #locals() 查看当前作用域中的所有名字
func()
3. global和nonlocal
glocal:把全局变量拿到局部来用
a = 20
def func():
global a #a不在是局部变量,是全局变量
a = 30 #把全局中的a重新赋值成30
print(a) 30
func()
print(a) 30
nonlocal:把离他最近的一层变量拿过来,不会找全局.
a = 10
def fun1():
a = 3
def func2():
nonlocal a # 找局部作用域中 离他最近的那个变量引入进来
a = 20
print(a) #结果是:20
func2()
print(a) #结果是:20
fun1()
接收n个参数,返回最大值和最小值
接收n个参数. 返回最大值和最小值(字典)
def func(*args):
m = args[0] # 假设第0项就是最大值
mi = args[0]
for el in args:
if el > m:
m = el # 当前这个元素比假设的那个大. 记录当前这个比较大的数
if el < mi:
mi = el
return {"最大值":m, "最小值":mi}
如果默认值参数是一个可变的数据类型,如果有人调用的时候改变了他,其他的位置看到的也跟着改变了.
# 如果默认值参数是一个可变的数据类型, 如果有人调用的时候改变了他. 其他位置看到的也跟着改变了
def extendList(val, list=[]):
list.append(val)
return list
list1 = extendList(10) #列表[10],列表指向的内存地址中存有10
list2 = extendList(123, []) #给了一个空的列表,默认值参数改变了成[],此时向里加了[123]
list3 = extendList('a') #此时向列表中加a,列表指向的是同一个内存地址,所以是[10,a]
print('list1=%s' % list1) [10,a] #如果默认值参数是一个可变的数据类型, 如果有人调用的时候改变了他. 其他位置看到的也跟着改变了
print('list2=%s' % list2) [123 ]
print('list3=%s' % list3) [10,a]
9*9乘法表
a = 1
while a <=9:
b = 1
while b <= a:
print("%dx%d=%d\t" % (a, b, a*b), end="")
b = b + 1
print() # 换行
a = a + 1
考试题;
user_list=[
{"name": "alex", "hobby": "抽烟"},
{"name": "alex", "hobby": "喝酒"},
{"name": "alex", "hobby": "烫头"},
{"name": "wusir", "hobby": "喊麦"},
{"name": "wusir", "hobby": "街舞"},
{"name": "alex", "hobby": "泡吧"},
{"name":"太白", "hobby":"开车"}
]
# [{"name": "alex", "hobby_list": ["抽烟","喝酒","烫头","泡吧"]},{"name": "wusir", "hobby_list": ["喊麦", "街舞"]},]
result = [] # {'name': 'alex', 'hobby_list': ['抽烟']}
for user in user_list:
# 1.判断是否在result里面存在了这个人, 如果存在. 把hobby_list添加一个hobby
# 2.不存在. 创建一个新字典
for new_user in result:
if user['name'] == new_user['name']:
new_user['hobby_list'].append(user['hobby'])
break
else:
dic = {}
dic["name"] = user['name']
dic['hobby_list'] = [user['hobby']]
result.append(dic)
print(result)

浙公网安备 33010602011771号