为了不使我们闹出昨天名为hamster的Harry这样的笑话,我们可以直接在实参中将名称和值联系起来,这样你就可以不用考虑实参的顺序了。
例如:
def describe_pet(animal_type,pet_name): print(f"\ni have a {animal_type}.") print(f"my {animal_type}'s name is {pet_name.title()}.") describe_pet(animal_type='hamster',pet_name='harry')
函数还和之前一样但是在调用函数的时候,他像Python明确的指出了个个实参对应的形参,这样的输出准确无误。
在我们编写函数时,可以给形参赋予一个默认值,例如,当我们知道宠物的种类大多是狗的时候我们就可以直接给种类的形参赋予一个默认值。
例如:
def describe_pet(animal_type,pet_name='dog'): print(f"\ni have a {animal_type}.") print(f"my {animal_type}'s name is {pet_name.title()}.") describe_pet(pet_name='harry')
我们没有在describe里面给定值,只是将形参的默认值进行了输出,但是我们要注意的是,形参的位置发生了改变,当我们赋给一个形参值时,另一个形参还需要继续寻找他的赋值,如果将已经赋值的形参放到前面,python将会继续按照循序进行赋值。
函数并非总是直接显示输出,他还可以处理一些数据,并且返回一个或者一组值,在函数中可以使用return将值返回到调用函数的代码行。
例如:
def get_formatter_name(first_name,last_name) full_name=f"{first_name}{last_name}" return full_name,title() musician=get_formatted_name('jimi','hendrix') print(musician)
函数get_formatter_name()的定义通过形参接受名和姓,在中间加上一个空格,并将结果赋给变量full_name,然后将full_name的值转换为首字母大写格式,并将结果返回到函数的调用行。
我们有时需要将实参变为可选的,可以使用默认值来让实参变成可选的。
例如,当我们要扩展函数get_formatted_name(),使用他处理中间名。我们可以将函数修改为这样:
def get_formatted_name(first_name,middle_name,last_name) full_name=f"{first_name}{middle_name}{last_name}" return full_name,title() musician=get_formatted_name('jimi','da','hendrix') print(musician)
但是并不是所有人都有中间名,如果只提供了两个值,程序就不能正常运行,我么可以将函数改为:
def get_formatted_name(first_name,last_name) if middle_name full_name=f"{first_name}{middle_name}{last_name}" else: full_name=f"{first_name}{last_name} return full_name,title() musician=get_formatted_name('jimi','hendrix') print(musician) musician=get_formatted_name('john','hooker','lee') print(musician)
函数可以返回任何值包括数列和字典,,我们可以创建一个字典用来储存姓名
例如:
def build_person(first_name,last_name): person={'first':first_name,'last':last_name} return person musician=build_person('jimi','hendrix') print(musician)
函数build_person()接受名和姓,讲这些值储存到字典中,最后返回表示人的整个字典,打印这个返回的值输出结果是:
{'first':'jimi','last':'hendrix'}
def get_formatted_name(first_name,last_name) full_name=f"{first_name}{last_name}" while Ture: print("\nplease tell me your name:") f_name=input("First name:") l_name=input("Last name:") formatted_name=get_formatted_name(f_name,l_name) print("\nhello,{formatted_nmae}.")
当然我们会发现在while循环中这将是一个无线循环,现在我们可以把他加上break让他进行退出。
def get_formatted_name(first_name,last_name) full_name=f"{first_name}{last_name}" while Ture: print("\nplease tell me your name:") print("(enter'q'at any time to quit)") f_name=input("First name:") if f_name=='q': break l_name=input("Last name:") if l_name=='q' break formatted_name=get_formatter_name(f_name,l_name) print("\nhelllo,{formattted_name}")
我们在用户每次输出的时候都会提示,当输入q的时候就会退出。