#函数:执行具体任务的代码块#接下来制作一个打招呼的函数为例子def greet(): print('hello')greet()#再看看如何向函数传递信息def greet1(user): print(f"hello,{user.title()}") greet1('ben') #可以看到,这个函数括号里的东西就是参数#user是形参,相当于定义这个函数需要什么参数#ben这个信息相当于实参,相当于告诉这个函数用什么信息展开工作#接下来让我们聚焦位置实参,关键字实参以及默认值#我们先看看位置实参:一个函数可以有多个参数,位置实参相当于按顺序传递#第一个参数是a类型,第二个参数是b类型,那么传入实参的时候就要严格依照这个顺序def user(name,age): print(f"you are {age} years old,{name}")user('jason' , '12')#就像这样,与上边顺序相对应 #关键字实参可以忽略顺序,但是需要遵循以下格式def user1(name,age): print(f"you are {age} years old,{name}")user1(age = '12' , name = 'jason')#谈到函数就要谈一谈返回值:就像数学上的函数,有输入也会有输出def name(firstname , lastname): fullname = f"{firstname}{lastname}" return fullname.title()#这里的return就是返回me = name('frantz' , 'mourn')#将值返回到这个变量print(me)#结合if,我们可以让输入变为可选的,比如,不是所有人都有中间名def forname(name1 , name3 , name2 = ''):#将中间名置空 #如果不置空,将会把输入的姓默认为name2,从而缺少参数 if name2:#这个的意思是,如果有中间名(详见往期if判断的讲解) forname = f'{name1}{name2}{name3}' else: forname = f'{name1}{name3}' return forname.title() name4 = forname('massen' , 'ludwig' , 'mortz')print(name4)name5 = forname('benjamin' , 'franklin')print(name5)#接下来是返回字典def dict(fname , lname): person = {'first':fname , 'last':lname} return personname6 = dict('jean' , 'hooker')print(name6)#同样,也可以有参数选择def dict1(fname , lname , age = None):#可以直接将这个值赋值为none,注意大写 person1 = {'first':fname , 'last':lname} if age : person1['age'] = age return person1name7 = dict1('jean' , 'hooker' , age = 21)print(name7)#如果把函数和while还有字典结合到一起会发生什么呢?def getname(finame , sename): fullname = f'{finame}{sename}' return fullname.title()while True:#相当于一直重复下边的代码 print("\nenter your name") print("enter q to quit") finame = input("first name:") if finame == "q": break sename = input("second name:") if sename == "q": break full_name = getname(finame , sename) print(f"hello,{full_name}")#再看看函数与传递列表def greet(names): for i in names: print(f"hello,{i.title()}")user = ['anna','ben','john']greet(user)#以上这个函数会返回列表并遍历#在函数中如何修改列表呢?#接下来先看看不用函数的# designs = ['case' , 'robot' , 'phone']#models = []#while designs:#这个条件就是在列表非空的时候# cdesign = designs.pop()#自动弹出一个列表里的元素# print(f"pmodel:{cdesign}") # models.append(cdesign)#for i in models: # print(i)def makemodels(designs , models): while designs: cdesign = designs.pop() print(f"正在制作{cdesign}") models.append(cdesign)udesign = ['case' , 'robot' , 'phone']cmodels = []makemodels(udesign , cmodels)print(udesign)#这个列表的元素已经全部被弹到下面这个列表了print(cmodels) #有没有什么办法不修改原列表呢?可以直接使用副本# 就像这样使用切片表示法def prmodels(undesign , comodel): while undesign: cudesign = undesign.pop() print(f"正在打印模型{cudesign}") comodel.append(cudesign)undesign = ['case','robot','phone']comodel = []#接下来是这个方法最关键的一步,也就是列表的切片表示法,可以看往期文章复习prmodels(undesign[:] , comodel)print("原列表:",undesign)print("完成的列表",comodel)#众所周知,现实世界是复杂的,这就要求我们的函数能够处理多个参数#如何传递任意数量的实参呢?可以在函数定义的时候,参数变量名前加星号def makebanmian(*peiliao):#就像这样 print(peiliao)makebanmian('egg')makebanmian('pepper','tofu') #现在我们引入遍历def makebanmian(*peiliao): for i in peiliao: print(i)makebanmian('egg')makebanmian('pepper','tofu','cumcumber')#同样,这种形式可以与规定的参数形式一起混合使用def mbanmian(size , *toppings): for i in toppings: print(i)mbanmian(1 , 'egg') mbanmian(2 , 'egg','pepper','tofu','cumcumber') #有没有办法组织一下这些任意参数的变量?可以用两个星号,接受为字典def profile(first , last , **userinfo):#就像这样 userinfo['firstname'] = first userinfo['lastname'] = last#前两个参数被固定接收 return userinfoprofile = profile('albert' , 'einstine' , location = 'princeton' , field = 'physics')#后两个参数为自定义接收print(profile)#接下来是函数的最后一关:存储在模块中#模块实际上是一个可重复调用的代码import math_tools#相当于把这个模块导入了result1 = math_tools.add(2,3)result2 = math_tools.multiply(4,5)print(result1)print(result2)#或者,只导入这个模块的一个函数from math_tools import addresult = add(2, 3)print(result)#多个就是直接在import后边加其他函数名,用逗号隔开#接下来看看as的用法:如果模块或者函数名过长,可以用这个起别名,方便使用import math_tools as mtprint(mt.add(2, 3))print(mt.multiply(4, 5))from math_tools import multiply as mulresult = mul(4, 5)print(result)#嗯,函数就到此为止了