python之路——10
王二学习python的笔记以及记录,如有雷同,那也没事,欢迎交流,wx:wyb199594
复习
a.函数可读性强,复用性强
def 函数名()
函数体
return 返回值
函数先定义后执行,
b.返回值
1.没有返回值
2.返回一个值
3.返回多个值:多个值用逗号隔开;可用一个或多个等量变量接受
c.参数
1.形参:定义函数
位置参数:必须传
*args 动态参数,接受任意多个,按位置传入的参数
默认参数:可不传
**kwargs 动态参数,可接受任意多,按关键字传入的参数
2.实参:调用函数
按照位置传参数
按照关键字传参数 :可以混用,顺序:位置+关键字
3.默认参数陷阱
如果默认参数的值是一个可变数据类型,那么每次调用函数,如果不传值,就公用一个数据类型资源
学习内容
1.命名空间
内置命名空间
python解释器一启动就可以使用的名字就存储在内置命名空间
内置的名字在启动解释器的时候就加载进内存
全局命名空间
程序从上之下被执行的过程中依次加载进内存
放置了我们设置的所有变量名和函数名
局部命名空间
函数内部定义的名字
调用函数时,才会产生这个名称空间,函数执行结束,则命名空间消失
规则:
1.局部:可以使用全局和内置
全局:使用内置,不能使用局部
内置:不能使用全局和局部
2.全局定义与内置名字冲突时,会使用全局的名字
如果有,就不找上级;如果自己没有,就找上级;上级没有,找上上级
多个函数,拥有多个独立的局部名字空间,不共享
2.作用域
全局作用域 globals
作用于全局,内置和全局名字空间的名字都属于全局作用域
局部作用域 locals
作用于局部,函数(局部命名空间)
#对于不可变数据类型,局部可查看不可修改; 若要修改, 函数内global声明
3.函数的嵌套定义与调用
nonlocal
4.函数的本质
1.函数名是内存地址
2.函数名可以赋值
3.函数名可以作为容器类型的元素
4.函数名可以作为函数的参数,返回值
5.闭包
代码区
函数嵌套与调用
def outer(): a = 2 def inner(): b = 3 def inner2(): nonlocal a a += 1 print('inner2', a) inner2() print('inner', a) inner() print(a) outer() print(a)
闭包
def outer(): a = 1 def inner(): print(a) print(inner.__closure__) return inner inn = outer() ''' ''' def wrapper(): money = 1000 def func(): name = 'eva' print(func.__closure__) def inner(): print(name,money) print(inner.__closure__) return inner return func f = wrapper() i = f() i() print(wrapper.__closure__)
作业

#2、写函数,检查获取传入列表或元组对象的所有奇数位索引对应的元素,并将其作为新列表返回给调用者。 # def func(l): # return l[1::2] # print(func([1,2,3,4,5,6,7,8,9])) # 3、写函数,判断用户传入的值(字符串、列表、元组)长度是否大于5。 # def func(l): # if len(l) > 5: # return '大于5啦' # else: # return '没有大于5啦' # print(func('sd')) # 4、写函数,检查传入列表的长度,如果大于2, # 那么仅保留前两个长度的内容,并将新内容返回给调用者。 # def func(l): # if len(l) > 2: # return l[0:2] # print(func([1,1,1,1])) # 5、写函数,计算传入字符串中【数字】、【字母】、【空格】 以及 【其他】的个数,并返回结果。 # def func(l): # dic = {'digit': 0, 'letter': 0, 'space': 0, 'other': 0, } # for i in l: # if i.isdigit(): # dic['digit'] += 1 # elif i.isalpha(): # dic['letter'] += 1 # elif i == ' ': # dic['space'] +=1 # else: # dic['other'] +=1 # return dic # print(func('a')) # 6、写函数,检查用户传入的对象(字符串、列表、元组) # 的每一个元素是否含有空内容,并返回结果。 # def func(l): # for i in l: # if i == ' ': # return '存在空内容' # print(func('')) #7、写函数,检查传入字典的每一个value的长度,如果大于2, # 那么仅保留前两个长度的内容,并将新内容返回给调用者。 dic = {"k1": "v1v1", "k2": [11,22,33,44]} for i in dic: print(i) # PS:字典中的value只能是字符串或列表 # def func(l): # a = [] # for i in l.keys(): # a.append(i) # for j in a: # l[j] = l[j][:2] # return l # print(func({"k1": "v1v1", "k2": [11,22,33,44]})) ################################################# # def func(dic): # for k in dic: # if len(dic[k]) > 2: # dic[k] = dic[k][:2] # return dic # dic = {"k1": "v1v1", "k2": [11,22,33,44]} # print(func(dic)) # 8、写函数,接收两个数字参数,返回比较大的那个数字。 # def func(a,b): # if a > b: # return a # elif a < b: # return b # else: # return '相等' # print(func(2,2)) # 三元运算 # 变量 = 条件返回True的结果 if 条件 else 条件返回False的结果 #必须要有结果 #必须要有if和else #只能是简单的情况 # a = 1 # b = 5 # c = a if a>b else b #三元运算 # print(c) # 9、写函数,用户传入修改的文件名,与要修改的内容, # 执行函数,完成整个文件的批量修改操作(进阶)。 # def func(filename, old, new): # with open(filename, encoding='utf-8') as f, open('%s.bak'%filename,'w',encoding='utf-8') as f1: # for line in f: # if old in line: # line = line.replace(old,new) # f1.write(line) # import os # os.remove(filename) # os.rename('%s.bak'%filename, filename) # func('lod', '大家', '你') # 2、写函数,接收n个数字,求这些参数数字的和。 # def func(*l): # sum = 0 # for i in l: # sum = sum + i # return sum # print(func(1,2,3,1,3)) # 3、读代码,回答:代码中,打印出来的值a,b,c分别是什么?为什么? # a=10 # b=20 # def test5(a,b): # print(a,b) # c = test5(b,a) # # print(c) # 4、读代码,回答:代码中,打印出来的值a,b,c分别是什么?为什么? # a=10 # b=20 # def test5(a,b): # a=3 # b=5 # print(a,b) # c = test5(b,a) # print(c)