python之路——10

时间:2024-01-11 16:24:08

王二学习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)