收集参数
收集参数: (1)普通收集参数 (2)关键字收集参数 '''
(1) 普通收集参数 (可变参数)
''' 语法: def func(*参数): pass 参数前面加上一个* 的就是普通收集参数; 普通收集参数专门用于收集多余的,没人要的普通实参,形成一个元组 arg => argument 参数 '''
# 函数的定义处 def mysum(*arg): total = 0 print(arg) for i in arg: total += i print(total) mysum(1,5,7,1000) # (1, 5, 7, 1000)
(2) 关键字收集参数
# 语法 def func(**参数): pass 参数前面加上**的就是关键字收集参数 关键字收集参数:用于收集多余的,没人要的关键字实参,形成一个字典 def func(a,b,c,**kwargs): pass kwargs => keyword关键字 arguments多个参数 def func(a,b,c,**kwargs): print(a,b,c) print(kwargs) func(1,2,3,f=11,d=13,zz=99)
# 1 2 3
# {'f': 11, 'd': 13, 'zz': 99}
'''
例2:
# 打印任意长度的字符 # 班长:黄文 # 班花:陈广耀 def func(**kwargs): dictvar = {"monitor":"班长","class_flower":"班花"} strvar1 = '' strvar2 = '' print(kwargs) # {'monitor': '黄文', 'class_flower': '陈广耀', 'people1': '黄熊大', 'people2': '黄将用'} for a, b in kwargs.items(): if a in dictvar: strvar1 += dictvar[a] + ":" + b + '\n' else: strvar2 += "吃瓜群众:" + b+'\n' print(strvar1) # 班长: 黄文 # 班花: 陈广耀 print(strvar2) # 吃瓜群众: 黄熊大 # 吃瓜群众: 黄将用 func(monitor="黄文",class_flower="陈广耀",people1="黄熊大",people2="黄将用")
命名关键字
''' # 语法: def func(参数1,参数2,*,参数3,参数4): pass (1)在函数的定义处,* 号后面的参数就是命名关键字参数 (2)在函数的定义处,在普通收集参数和关键字收集参数之间的是命名关键字参数 def func(*arg,命名关键字参数,**kwargs) 命名关键字必须使用关键字实参的形式进行调用 '''
# 形式1 def func(a,b,*,c): print(a,b,c) func(1,2,c=4) # 1 2 4
# 形式2 ''' 如果命名关键字指定了默认值,那么在调用时, 可以不指定实参.默认使用自己的值 ''' def func(a,b,*,c=5): print(a,b,c) func(1,2,c=6) # 1 2 6
# 形式3 def func(*arg,d,**kwargs): print(arg) # 1 2 23 print(kwargs) # {c:1,f:2} print(d) # d = 3 func(1,2,23,c=1,f=2,d=3) # (1, 2, 23) # {'c': 1, 'f': 2} # 3
(3)*和**的魔术用法:打包和解包
*和**,在函数的定义处,负责打包(把实参都收集过来,放在元组或字典中)
*和**,在函数的调用处,负责解包(把容器类型的数据,一个一个拿出来,进行传递)
def func(a,b,c): print(a,b,c) listvar = [1,2,3] # *一般修饰列表更多一些 (负责把列表里面的元素一个一个拿出来的进行函数调用) func(*listvar) # <==> func(1,2,3) # 1 2 3 def func(a,b,c,*,d,e,f): print(a,b,c) print(d,e,f) listvar = [1,2,3] dic = {"d":4,"e":5,"f":6} # func(d=4,e=5,f=6) # **一般修饰字典,(负责把字典里面的键值对变成d=4,e=5的形式,进行函数调用) func(1,2,3,**dic) # <==> d=4 , e = 5 , f = 6 # 1 2 3 # # 4 5 6 # * 和 ** 的解包操作 func(*listvar,**dic) # 1 2 3 # 4 5 6
# 函数参数的默认顺序:
必须按照如下的参数顺序进行定义:
普通形参(位置形参) -> 默认形参 -> 普通收集参数 -> 命名关键字参数 -> 关键字收集参数
def f1(a, b, c=0, *args, **kw): print('a =', a, 'b =', b, 'c =', c, 'args =', args, 'kw =', kw) def f2(a, b, c=0, *, d, **kw): print('a =', a, 'b =', b, 'c =', c, 'd =', d, 'kw =', kw) #(一) # f1(1, 2) #a=1,b=2,c=0 args=(),kw={} # f1(1, 2, c=3) #a=1,b=2,c=3,args=(),kw={} # f1(1, 2, 3, 'a', 'b') #a=1,b=2,c=3,args=(a,b),kw={} # f1(1, 2, 3, 'a', 'b', x=99) #a=1,b=2,c=3,args=(a,b),kw={'x':99} # f2(1, 2, d=99, ext=None) # a=1,b=2,c=0,d=99,kw={'ext':None} #(二) args = (1, 2, 3, 4) kw = {'d': 99, 'x': '#'} f1(*args, **kw) # a=1,b=2,c=3,args=(4,),kw={"d":99,"x":"#"} # *args <==> f1(1,2,3,4) # **kw <==> f1(d=99,x="#") #(三) def f2(a, b, c=0, *, d, **kw): print('a =', a, 'b =', b, 'c =', c, 'd =', d, 'kw =', kw) myargs = (1, 2, 3) mykw = {'d': 88, 'x': '#'} f2(*myargs, **mykw) #a=1,b=2,c=3,d=88,kw={"x":"#"} #(四) # 定义处 def f1(a, b, c=0, *args,d,**kw): print('a =', a, 'b =', b, 'c =', c, 'args =', args, 'kw =', kw) print(d) # 调用处 f1(1,2,3, 'a', 'b',d=67, x=99,y=77)#a=1,b=2,c=3,args=(a,b) kw={x:99,y:77} d=67 # 普通收集形参 和 关键字收集形参 可以接受到所有种类的参数 # *args,**kwargs 都是可变长参数,参数的长度不限制 def func(*args,**kwargs): pass
函数的返回值
1.return 后面的数据类型
"""
return: 自定义返回值 , 返回到哪里? 返回到函数的[调用处]
1.return 后面可以跟上六大标准数据类型 , 除此之外,可以跟上 类对象,函数,如果不写return ,默认返回None
2.return 如果执行了return ,意味着 return后面得所有代码,统统不执行,函数终止了.
"""
def func(): # return 1 # return 3.14 # return True # return 4j # return [1,2,3,4] return {"a":1,"b":2} res = func() # res = {"a":1,"b":2} print(res) # {'a': 1, 'b': 2}
(2) 如果不写return ,默认返回None
def func(): a =1 res = func() print(res) # None
(3) 执行完return 之后,函数立刻终止,后面的代码不执行
def func(): print("执行到1") print("执行到2") return 1 print("执行到3") print("执行到4") return 2 res = func() print(res) # 执行到1 # 执行到2 # 1
(4)注意点:
def calc(sign,num1,num2): if sign == "+": res = num1 + num2 elif sign == "-": res = num1 - num2 elif sign == "*": res = num1 * num2 elif sign == "/": if num2 == 0: return "大兄弟,除数不能为0" res = num1 / num2 else: return "不会,别问我!!!!!!,你是有趣的灵魂" return res res = calc("^",5,0) print(res) # 不会,别问我!!!!!!,你是有趣的灵魂 # print打印的值和返回值是两个不相干的概念 return + 值 自定义的
函数名的使用
# python中的函数可以像变量一样,动态创建,销毁,当参数传递,作为值返回,叫第一类对象.其他语言功能有限
1.函数名是个特殊的变量,可以当做变量赋值
2.函数名可以作为容器类型数据的元素
3.函数名可以作为函数的参数
4.函数名可作为函数的返回值
__doc__或者help查看文档
1.函数名是个特殊的变量,可以当做变量的赋值
def func():
print(1)
# 变量的赋值操作 func2 = func func2() # func() # 1
动态的销毁变量
del func2 # del 关键字 用来删除变量的
# func2() # error
2.函数名可以作为容器类型数据的元素
def func1(): print(1) def func2(): print(2) def func3(): print(3) def func4(): print(4) lst = [func1,func2,func3,func4] for i in lst: # print(i) i() # 函数的调用 # 1 # 2 # 3 # 4
3.函数名作为函数的参数
def func(a): # a = func2 res = a() print(res) def func2(): return 123 func(func2) # 123
4.函数名可以作为函数的返回值
def func(a): # a = func2 return a <==> return func2 return a def func2(): return 456 # 函数的调用处 res = func(func2) # res = func2 print(res) # <function func2 at 0x00000000028FB268> total = res() # res() <==> func2() print(total) # 456
5.# __doc__或者help查看文档
#(1) help
# help(print)
#(2)__doc__ 魔术属性 res = print.__doc__ print(res) # Help on function kao_qiezi in module __main__: #(3) 自定义函数文档 def kao_qiezi(qimin): ''' 功能:告诉你如何做烤茄子 参数:是一个器皿 返回值:返回烧烤的状态 ''' print("从中间抛开,扔到烧烤架子上面") print("扔胡椒面,扔孜然,扔蒜蓉,扔香菜") print("用一个%s来盛放" % (qimin)) return "这个茄子做好了" kao_qiezi("盆") help(kao_qiezi) # kao_qiezi(qimin) # # 功能:告诉你如何做烤茄子 # # 参数:是一个器皿 # # 返回值:返回烧烤的状态
局部变量和全局变量
# #3.文件a.txt内容:每一行内容分别为商品名字,价钱,个数。 # apple 10 3 # tesla 100000 1 # mac 3000 2 # lenovo 30000 3 # chicken 10 3 # # 通过代码,将其构建成这种数据类型:[{'name':'apple','price':10,'amount':3},{'name':'tesla','price':1000000,'amount':1}......] 并计算出总价钱。 with open("1.txt", mode="r+", encoding="utf-8") as fp: lst = [] sum = 0 for line in fp: line = line.strip().split() # apple 10 3 line = [apple , 10 , 3] lst.append({'name': line[0], 'price': line[1], 'amount': line[2]}) # [ {...} , {....} ] # 单品价格 * 总数 = 总价格(单品) 苹果(10) * 苹果数量(3) = 苹果总价30 sum += int(line[1]) * int(line[2]) print(lst) # [{'name': 'apple', 'price': '10', 'amount': '3'}, # {'name': 'tesla', 'price': '100000', 'amount': '1'}, # {'name': 'mac', 'price': '3000', 'amount': '2'}, # {'name': 'lenovo', 'price': '30000', 'amount': '3'}, # {'name': 'chicken', 'price': '10', 'amount': '3'}] print(sum) # 196060 with open("1.txt", mode="r+", encoding="utf-8") as fp: lst = [] sum = 0 for line in fp: line = line.strip().split() lst.append({'name': line[0],'price': line[1], 'amount': line[2]}) sum += int(line[1]* int(line[2])) print(lst) print(sum) # 4.把字符串 "k:1|k1:2|k2:3|k3:4" 处理成字典 {'k':1,'k1':2....} listvar = {} strvar = "k:1|k1:2|k2:3|k3:4" strvar1 = strvar.split("|") for i in strvar1: strvar2 = i.split(":") listvar[strvar2[0]] = int(strvar2[1]) print(listvar) # {'k': 1, 'k1': 2, 'k2': 3, 'k3': 4} # # 5.有如下值li= [11,22,33,44,55,66,77,88,99,90] # ''' # 将大于 66 的值保存至字典的k1键中, # 将小于 66 的值保存至字典的k2键中。 # 即: {'k1': 大于66的所有值列表, 'k2': 小于66的所有值列表} # ''' li = [11, 22, 33, 44, 55, 66, 77, 88, 99, 90] dictvar = {'k1': [], 'k2': []} for i in li: if i > 66: dictvar['k1'].append(i) elif i < 66: dictvar['k2'].append(i) print(dictvar) # {'k1': [77, 88, 99, 90], 'k2': [11, 22, 33, 44, 55]} strvar = "{who:*^10}在长春长生{something:>>10},心情{feel:!<10}" res = strvar.format(who="潘伟成",something="扎一打疫苗", feel="爽歪歪") print(res) # ***潘伟成****在长春长生>>>>>扎一打疫苗,心情爽歪歪!!!!!!! strvar = "姚承政买了{:3d}个兰博基尼" res = strvar.format(10) print(res) # 姚承政买了 10个兰博基尼 # :^3d strvar = "姚承政买了{:<3d}个兰博基尼" res = strvar.format(10) print(res) # 姚承政买了10 个兰博基尼 strvar = "姚承政买了{:>4d}个兰博基尼" res = strvar.format(10) print(res) # 姚承政买了 10个兰博基尼 strvar = "姚承政买了{:^4d}个兰博基尼" res = strvar.format(10) print(res) # 姚承政买了 10 个兰博基尼