【主要内容】
1. 动态参数
位置参数的动态参数: *args
关键字参数的动态参数 : **kwargs
顺序:
位置,*args,默认值,**kwargs
在形参上*聚合, **聚合
在实参上*打散, **打散
2. 命名空间和作用域
命名空间:
1. 内置命名空间: python解释内部运行时的变量函数
2. 全局命名空间: 我们在py文件中直接声明出来的变量,函数
3. 局部命名空间: 在函数内部声明的变量和函数.
作用域:
1.全局作用域:内置+全局
2.局部作用域:局部
globals() 查看全局作用域中的名字
locals() 查看当前作用域中的名字
3. global和nonlocal
global: 把全局变量拿到局部来用.
nonlocal: 把离他最近的一层的变量拿过来.不会找全局
【代码】
1、动态传参
1 # def chi(good_food, bad_food,drink, ice, jiu): 2 # print("我要吃", good_food, bad_food) 3 # 4 # chi("盖浇饭", "辣条") 5 6 # 位置参数 > *动态参数 > 默认值参数 7 8 9 # def chi( *food, a, b): # 可以传入任意的位置参数 10 # print("我要吃", food) # 动态参数接收到的是tuple类型的数据 11 # 12 # chi("盖浇饭", "辣条", "面条") 13 # def func(a, b, c, *args, d = 5): 14 # print(a, b, c, d, args) 15 # 16 # func(1,2,3) 17 # func(1,2,3,4,5,6,7, d ="马大哈") 18 19 # def chi(*food): 20 # print("我要吃", food) 21 22 # 写函数. 给函数传递任意个整数. 返回这些数的和 23 # def he(*n): 24 # sum = 0 25 # for e in n: 26 # sum += e 27 # return sum 28 # print(he(5)) 29 30 31 # 动态接收关键字参数 32 # *位置参数 33 # **关键字参数 34 # def func(**food): # **food动态接收关键字参数 35 # print(food) # 接收到的是字典 36 # 37 # func(good_food="盖浇饭", bad_food="辣条", drink="冰封") 38 39 # 关键字参数一定在位置参数后面 40 # 位置参数 > *args > 默认值 > **kwargs 41 42 # 这个函数可以接收所有的参数(无敌的) 43 # def func(*args, **kwargs): 44 # print(args) 45 # print(kwargs) 46 # func(1, 2, 5, 6, name="taibai",age=18, sex="不详") 47 48 # 把列表中的每一个元素作为参数, 传递给函数. 一次都传过去 49 50 # def func(*args, **kwargs): # *表示聚合,所有的位置参数, 聚合成元组 **聚合成字典 51 # print(args) 52 # print(kwargs) 53 # 54 # 55 # # lst = ["马虎疼", "大洋哥", "小花生", "毛尖妹妹"] 56 # # func(*lst) # 实参, 打散, 迭代产生的 57 # 58 # dic = {"name":"太白", "alex":"wuse"} 59 # func(**dic) # 把字典打散. 以key=value形式进行传参 60 61 62 # def func(a, b): 63 # """ 64 # 计算a+b的和, 返回一个数 65 # :param a: 第一个数 66 # :param b: 第二个数 67 # :return: 返回计算之后的和 68 # """ 69 # return a + b 70 71 # 定义函数 72 # def 函数名(形参): 1.位置参数, 2, *args, 3.默认值参数, 4. **kwargs 73 # 函数体 return 返回值 74 # 函数名(实参) 1. 位置参数. 2.关键字参数. 3. 混合参数,
2、命名空间
1 # a = "123" # 全局 2 # b = 36 # 全局 3 # def func(): # 全局 4 # c = "马化腾" # 局部 5 # 6 # def func2(): 7 # print(c) 8 9 a = 10 10 def func(): 11 a = 20 12 print(a) # 就近原则 13 print(globals()) # globals() 获取到全局作用域(内置,全局)中的所有名字 14 print(locals()) # locals() 查看当前作用域中的所有名字 15 func()
3、函数的嵌套
1 # def chi(): 2 # print("我要吃") 3 # 4 # print(chi()) 5 6 # def func1(): 7 # print("哈哈") 8 # 9 # def func2(): 10 # func1() 11 # print("呵呵") 12 # func1() 13 # func2() 14 15 # def func1(): 16 # print("呵呵") 17 # def func2(): 18 # print("哈哈") 19 # func2() 20 # print("吼吼") 21 # func1() # 22 23 def func1(): 24 print("赵") 25 def func2(): 26 print("钱") 27 def func3(): 28 print("孙") 29 print("李") 30 def func4(): 31 print("哈哈") 32 func2() 33 print("周") 34 func2() 35 func1()
4、global与nonlocal
1 # def func(): 2 # global a # a 不再是局部变量. 是全局变量 3 # a = 30 # 把全局中的a重新赋值成30 4 # print(a) 5 # func() 6 # print(a) 7 8 # a = 10 9 # def func1(): 10 # 11 # def func2(): 12 # nonlocal a # 找局部作用域中 离他最近的那个变量引入进来 13 # a = 20 14 # print(a) 15 # func2() 16 # print(a) 17 # func1() 18 19 a = 1 20 def fun_1(): 21 a = 2 22 def fun_2(): 23 def fun_3(): 24 nonlocal a 25 a = 4 26 print(a) 27 print(a) 28 fun_3() 29 print(a) 30 print(a) 31 fun_2() 32 print(a) 33 print(a) 34 fun_1() 35 print(a)
5、作业与练习
1 #****************作业讲解****************** 2 ''' 3 # 2.写函数,检查传入列表或元组对象所有奇数位索引对应的元素,并将其作为新列表返回给调用者 4 def func(lst): 5 ll=[] 6 for i in range(len(lst)): 7 if i % 2 == 0: 8 ll.append(lst[i]) 9 return ll 10 a=[1,5,7,9,12] 11 ret=func(a) 12 print(ret) 13 14 15 # 3.写函数,判断用户传入的对象(字符串、列表、元组)长度是否大于5 16 def func(a): 17 if len(a)>5: 18 return True 19 else: 20 return False 21 ll=(1,2,3,4,5,6) 22 ret=func(ll) 23 print(ret) 24 25 # 4.写函数,检查传入列表德尔长度,如果大于2,将列表的前两项内容返回给调用者 26 def func(lst): 27 if len(lst) > 2: 28 return lst[0],lst[1] 29 ll=[1,2,3,4,5] 30 ret=func(ll) 31 #ret=list(ret) 32 print(ret) 33 34 # 5.写函数,计算输入函数的字符串中,数字、字母、空格以及其他内容的个数,并返回结果 35 def func(s=""): 36 shuzi=0 37 zimu=0 38 kongge=0 39 qita=0 40 for c in s: 41 if c.isdigit(): 42 shuzi+=1 43 elif c.isalpha(): 44 zimu+=1 45 elif c == ' ': 46 kongge+=1 47 else: 48 qita+=1 49 return shuzi,zimu,kongge,qita 50 s="dnsdvfv esm x234467432ndjdknv456452 r4222c...#$%^^" 51 ret=func(s) 52 print(ret) 53 54 # 6.写函数,接收两个数字参数,返回较大的那一个 55 def func(a,b): 56 if a > b: 57 return a 58 else: 59 return b 60 #c= a if a>b else b 61 #return c 62 a=input("请输入第一个数:") 63 b=input("请输入第二个数:") 64 ret=func(int(a),int(b)) 65 print(ret) 66 67 # 7.写函数,检查传入字典的每一个value的长度,如果大于2,那么仅保留前两个长度的内容,并将新的内容返回给调用者 68 # dic={"k1":"v1v1","k2":[11,22,33,44]} 69 # dic={"k1":"v1","k2":[11,22]} 70 def func(dic): 71 new_dic={} 72 for k,v in dic.items(): 73 if len(v) > 2: 74 new_dic[k]=v[0:2] 75 else: 76 new_dic[k]=v 77 return new_dic 78 dic={"k1":"v1v1","k2":[11,22,33,44]} 79 print(func(dic)) 80 81 # 8.写函数,此函数只接收一个参数且此参数必须是列表数据类型,此函数完成的功能是返回给调用者一个字典,此字典的键值对为此列表的索引及对应的元素。 82 def func(lst): 83 dic={} 84 for i in range(len(lst)): 85 dic[i]=lst[i] 86 return dic 87 lst=[11,22,33] 88 print(func(lst)) 89 90 # 9.写函数,函数接收四个参数分别是:姓名,性别,年龄,学历。用户通过输入这四个内容, 91 # 然后将这四个内容传入到函数中,此函数接收到这四个内容,将内容追加到一个student_msg文件中。 92 def func(name,age,sex,edu): 93 f=open("student_msg",mode="a",encoding="utf-8") 94 f.write(name+"_"+str(age)+"_"+sex+"_"+edu+" ") 95 f.flush() 96 f.close() 97 98 # 11.写函数,用户传入修改的文件名,与要修改的内容(两个:修改与被修改),执行函数,完成整个文件的批量修改操作。 99 import os 100 def func(filename,old,new): 101 with open(filename,mode="r",encoding="utf-8") as f1, 102 open(filename+"_副本",mode="w",encoding="utf-8") as f2: 103 104 for line in f1: 105 s=line.replace(old,new) 106 f2.write(s) 107 os.remove(filename) 108 os.rename(filename+"_副本",filename) 109 func("student.msg","学","本") 110 ''' 111 112 #*************今日练习********************* 113 ''' 114 # 动态传参 115 # 1、*位置参数 116 def func(*n): 117 sum=0 118 for i in n: 119 sum+=i 120 return sum 121 print(func(5,6,7)) 122 123 # 2、**关键字参数 124 def func(**food): 125 print(food) #接收到的是字典 126 func(good_food="盖浇饭",bad_food="辣条") 127 ''' 128 # 命名空间 129 # 加载顺序:内置空间 > 全局空间 > 局部空间 130 # 取值顺序:局部空间 > 全局空间 > 内置空间(就近原则) 131 a="123" #全局 132 b=12 #全局 133 def func(): #全局 134 c="麻花特" #局部 135 def hah():#局部 136 pass