#一、定义函数 def Hello(): print("hello") Hello() #调用函数 #1.实参和形参 def Hello(name): #name是形参 print("Hello"+name) Hello('Tom') #Tom是实参 #变量name是形参:函数完成工作所需的一项信息 #值Tom是一个实参:实参是调用函数时传递给函数的信息 #我们调用函数时,将实参传递给了函数Hello,这个值被存储到形参username中 #二、传递实参 #1.位置实参:调用函数时Python必须将函数调用中的每个实参都关联到函数定义中的一个形参 #基于实参顺序的关联方式成为位置实参 def pet(animal_type,pet_name): print(" 我有一个"+animal_type) print("我的"+animal_type+"名字叫"+pet_name) #调用函数 pet('dog','旺财') #Python将dog关联到形参animal_type,将旺财关联到形参pet_name #2.关键字实参 def pet(animal_type,pet_name): print(" 我有一个"+animal_type) print("我的"+animal_type+"名字叫"+pet_name) #调用函数 pet(animal_type='dog2',pet_name='旺财2') #关键字实参 #3.默认值 def pet(pet_name,animal_type='dog'): print(" 我有一个"+animal_type) print("我的"+animal_type+"名字叫"+pet_name) #调用函数 pet(pet_name='旺财3') # 形参已经指定默认值为dog,调用时如果没给实参赋值,这默认形参的dog #4.等效函数调用 def pet(pet_name,animal_type='dog'): print(" 我有一个" + animal_type) print("我的" + animal_type + "名字叫" + pet_name) #下面对这个函数的调用都可行 #一条名为旺财财的小狗 pet("旺财财4") pet("pet_name='旺财财5'") #一只名为畅畅的猫 pet('畅畅6','hamster') pet(pet_name='畅畅7',animal_type='cat') pet(animal_type='cat',pet_name='畅畅8') #三、返回值 #1.函数并非总是直接显示输出,相反,它可以处理一些数据,并返回一个或一组值。函数返回的值被称为返回值 def get_name(first_name,last_name): full_name=first_name+last_name return full_name musician=get_name('Robin','Guo') print(musician) #2.让实参变成可选的 def get_name(first_name,middle_name,last_name): full_name=first_name+middle_name+last_name return full_name musician=get_name('xin','z','guo') print(musician) #并非每个人都有中间名,当实参只提供了名和姓,程序将不能正确运行,为了使中间名可选,在形参middle_name指定个默认值(空字符串) def get_name(first_name,last_name,middle_name=' '): if middle_name: full_name=first_name+middle_name+last_name else: full_name = first_name + last_name return full_name musician=get_name('xin','guo') print(musician) musician=get_name('xin','guo','z') print(musician) #3.返回字典 #函数可返回任何类型的值,包括列表和字典等较复杂的数据结构 def person(first_name,last_name): #返回一个字典,其中包含一个人的信息 person={'first':first_name,'last':last_name} return person musician=person('robin','guo') print(musician) #新增一个可选形参age并将其默认为空字符串,如果函数调用这个形参的值,这个值将被存到字典 def person(first_name,last_name,age=' '): #返回一个字典,其中包含一个人的信息 person={'first':first_name,'last':last_name} if age: person['age']=age return person musician=person('robin','guo',age=24) print(musician) #4.结合使用函数和while循环 def get_name(first_name,last_name): full_name=first_name+last_name return full_name while True: print(" 请说出你的名字") print("按q退出") f_name=input("名字是:") if f_name=='q': break l_name=input("姓是:") if l_name=='q': break name=get_name(f_name,l_name) print(name) #四、传递列表 #1.将列表传递给函数后,函数就能直接访问其内容 def users(names): #names 是形参列表 for name in names: msg="你好"+name print(msg) usernames=['robin','tom','jack','steven'] #实参列表 users(usernames) #2.在函数中修改列表 #定义了一个打印模型的函数包括两个形参一个是未打印设计列表和打印好的模型列表 def print_models(unprinted_designs,completed_models): #模拟打印每个设计,直到没有未打印的设计为止 #打印每个设计后,都将其移到列表completed_models中 while unprinted_designs: current_design=unprinted_designs.pop() print("打印模型:"+current_design) completed_models.append(current_design) def show_completed_models(completed_models): print(" ") for completed_model in completed_models: print(completed_model) unprinted_designs=['iphone case','robot pendant','dodecahedron'] completed_models=[ ] print_models(unprinted_designs,completed_models) show_completed_models(completed_models) #3.禁止函数修改列表 #y有时候,需要禁止函数修改列表,如果打印完所有的设计后,想要保留原来的未打印设计列表,以供备案。 #由于将所有数据移除了,未打印设计列表便为空,原来的列表没有了。 #未解决这个问题,可向函数传递列表的副本而不是原件;这样函数所做的任何修改,只都影响副本。 #要将列表副本传递给函数 function_name(list_name[:]) #[:]切片表示法 创建列表副本,如果不想清空未打印设计列表,可像下面调用print_models(): print_models(unprinted_designs[:],completed_models) #五、传递任意数量的实参 #1.有时候你预先不知道函数需要接受多少个实参, #比如制作披萨的函数,它需要很多配料,你无法确定顾客要多少种配料,这时函数只有一个形参*toppings, #无论调用语句提供多少实参,这个形参都将它们统统收入囊中 def make_pizza(*toppings): print(toppings) make_pizza('牛肉') make_pizza('猪肉','洋葱','芝士') #形参名中的*是让Python创建一个名为toppings的空元组,并将所收到的值装到这个元组中 #2.结合使用位置实参和任意数量实参 #如果要让函数接受不同类型的实参,必须在函数定义中将接纳任意数量实参的形参放在最后 def make_pizza(size,*toppings): print("披萨的尺寸"+str(size)) for topping in toppings: print("配料"+topping) make_pizza(16,'牛肉') make_pizza(12,'猪肉','洋葱','芝士') #3.使用任意数量的关键字实参 #有时候需要接受任意数量的实参,但预先不知道传递给函数的会是什么样的信息。这时可将函数编写成能够接受任意数量的键-值对 def person(first,last,**user_info): person={} person['first_name']=first person['last_name']=last for key,value in user_info: person[key]=value return person user_person=person('xin','guo',address='beijing',sex='man') print(user_person) #函数person()定义要求提供姓和名,同时允许用户根据需要提供任意数量的名称-值对。 #形参**user_info中的两个*让Python创建一个名为user_info的空字典,并将收到的所有名称-值对都封装到这个字典中。 #我们调用person(),向它传递名'xin' 姓'guo' 和两个键值对address='beijing',sex='man'
参考:《Python编程:从入门到实践》,本书作者Eric Matthes,译者袁国忠,由人民邮电出版社于2016年7月出版