定义函数 def greet_user(): """显示简单的问候语(docstring 文档字符串)""" print("Hello!") greet_user() 向函数传递信息 def greet_user1(username): print("Hello," + username.title() + "!") greet_user1("jack") 实参和形参 定义函数时,括号内的定义的变量即一个形参 实参是调用该函数时传递给函数的信息。 过程为:实参传递给形参 位置实参,基于实参顺序 def describe_pet(animal_type,pet_name): """显示宠物的信息""" print("\nI have a " + animal_type + '.') print("My " + animal_type + "'s name is " + pet_name.title() + ".") describe_pet('hamster','harry') describe_pet('dog','willie') 关键字实参,传递给函数的 名称——值对,在实参中将名称与值关联起来,无需考虑实参顺序 def describe_pet(animal_type,pet_name): """显示宠物信息""" print("\nI have a " + animal_type + ".") print("My " + animal_type + "'s name is " + pet_name.title() + ".") """以下两种调用,结果一致""" describe_pet(animal_type = 'hamster',pet_name = 'harry') describe_pet(pet_name='harry',animal_type= 'hamster') #注意 使用关键字实参时,务必准确地指定函数定义中的形参名 默认值 编写函数时,可以给形参指定默认值,调用提供实参时,Python使用实参值,否则使用形参默认值,因此使用默认值,可省略实参 def describe_pet(pet_name,animal_type='dog'): """显示宠物的信息""" print("\nI have a " + animal_type + ".") print("My " + animal_type + "'s name is " + pet_name.title() + ".") describe_pet(pet_name='willie') describe_pet('willie') describe_pet(pet_name='harry', animal_type='hamster') #使用默认值时,在形参列表中必须先列出没有默认值的形参,再列出有默认值的实参,能让Python更好的解读位置实参 返回值 使用return语句,将函数处理后的值,返回到调用该函数的代码行,简化主程序 返回简单值 def get_formatted_name(first_name,last_name): """返回整洁的姓名""" full_name = first_name + ' ' + last_name return full_name.title() musician = get_formatted_name('jimi','hendrix') print(musician) 让实参变成可选 def get_formatted_names(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.title() musician = get_formatted_names('jimi','hendrix') print(musician) musician = get_formatted_names('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) def build_person2(first_name,last_name,age=''): person = {'first':first_name,'last':last_name} if age: person['age'] = age return person musician2 = build_person2('jack','chen',age = 27) print (musician2) 结合使用函数和while 循环 def get_formentted_name(first_name,last_name): """返回整洁的姓名""" full_name = first_name + ' ' + last_name return full_name.title() #这是一个无限循环 while True: print("\nPlease tell me your name:") print("(enter 'quit'at any time to quit)") f_name = input("First name:") if f_name == 'quit': break l_name = input("Last name:") if l_name == 'quit': break formentted_name = get_formentted_name(f_name,l_name) print("\nHello," + formentted_name + "!") 传递列表 def greet_users(names): """向列表中的每位用户都发出简单的问候""" for name in names: msg = "Hello, " + name.title() + "!" print(msg) usernames = ['李明','lucy','张三','李四 greet_users(usernames) 在函数中修改列表 def print_models(unprinted_designs,completed_models): """ 模拟打印每个设计,直到没有未打印的设计为止 打印每个设计后,都将其移到列表completed_models中 """ while unprinted_designs: current_design = unprinted_designs.pop() #模拟根据设计制作3D打印模型的过程 print("Printing model: " + current_design) completed_models.append(current_design) def show_completed_models(completed_models): """显示打印好的所有模型""" print("\nThe following models have been printed:") for completed_model in completed_models: print(completed_model) unprinted_designs = ['iphone case','robot pendant','dodecahedron'] completed_models = [] print_models(unprinted_designs,completed_models) #不修改原有列表,进行副本创建print_models(unprinted_designs[:],completed_models) show_completed_models(completed_models) 传递任意数量的实参 def make_pizza(*toppings): #形参前的*号,让Py建立一个名为toppings的空元组,并将实参封装在元组内 """打印顾客点的所有配料""" print(toppings) make_pizza('peperoni') make_pizza('mushrooms','green peppers','extra cheese') #循环打印处理 def make_pizza(*toppings): #形参前的*号,让Py建立一个名为toppings的空元组,并将实参封装在元组内 """打印顾客点的所有配料""" print("\nMaking a pizza with the following toppings:") for topping in toppings: print('-' + topping) make_pizza('peperoni') make_pizza('mushrooms','green peppers','extra cheese') 结合使用位置实参和任意数量实参 def make_pizza(size,*toppings): """概述制作的比萨""" print("\nMake a " + str(size) + "-inch pizza with the following toppings:") for topping in toppings: print("-" + topping) make_pizza(16,'pepperoni') make_pizza(12,'mushrooms','green pepers','extra cheese') 使用任意数量的关键字实参 def build_profile(first,last,**user_info): """创建一个字典,其中包含我们知道的有关用户的一切""" profile = {} profile['first_name'] = first profile['last_name'] = last for key,value in user_info.items(): profile[key] = value return profile user_profile = build_profile('albert','einstein',location = 'princeton',field = 'physics') print(user_profile) 将函数存储在模块中 #实现代码块与主程序分离,将函数存储在被称为模块的py独立文件中,再讲模块导入主程序中 #import 语句允许在当前运行的程序文件中使用模块中的代码 导入整个模块 #需先建立有函数的独立模块的py文件 #先创建pizza.py文件 def make_pizza(size,*toppings): """概述要制作的比萨""" print("\nMaking a " + str(size) + "-inch pizza with the following toppings:") for topping in toppings: print("- " + topping) #在pizza.py所在的目录中创建另外一个名字为making_pizza.py的文件,在此文件中导入刚创建的pizza模块,通过 模块.函数名()的模式来使用模块内的任意函数 import pizza pizza.make_pizza(16,'pepperoni') pizza.make_pizza(12,'mushrooms','green peppers','extra cheese') 导入特定的函数 #语法:from module_name import function_name from pizza import make_pizza #由于现式的引入函数,所以该函数不需要模块.函数使用,直接使用函数名即可 make_pizza(16,'pepperoni') make_pizza(12,'mushrooms','green peppers','extra cheese') 使用as 给函数指定别名 #要导入函数名过长或有冲突,可as指定别名,语法:from module_name import function_name as fn from pizza import make_pizza as mp mp(16,'pepperoni') mp(12,'mushrooms','green peppers','extra cheese') 使用as 给模块指定别名 #对使用模块起别名,语法:import module_name as m import pizza as p p.make_pizza(16,'pepperoni') p.make_pizza(12,'mushrooms','green peppers','extra cheese') 导入模块中的所有函数 #使用星号(* )运算符可让Python导入模块中的所有函数 from pizza import * make_pizza(16,'pepperoni') make_pizza(12,'mushrooms','green peppers','extra cheese') 导入模块注意: import 语句中的星号让Python将模块pizza 中的每个函数都复制到这个程序文件中。由于导入了每个函数,可通过名称来调用每个函数,而无需使用句点表示法。然而,使用 并非自己编写的大型模块时,最好不要采用这种导入方法:如果模块中有函数的名称与你的项目中使用的名称相同,可能导致意想不到的结果:Python可能遇到多个名称相同的函 数或变量,进而覆盖函数,而不是分别导入所有的函数。 最佳的做法是,要么只导入你需要使用的函数,要么导入整个模块并使用句点表示法。这能让代码更清晰,更容易阅读和理解。这里之所以介绍这种导入方法,只是想让你在阅 读别人编写的代码时,如果遇到类似于下面的import 语句,能够理解它们: from module_name import * 函数编写指南 编写函数时,需要牢记几个细节。应给函数指定描述性名称,且只在其中使用小写字母和下划线。描述性名称可帮助你和别人明白代码想要做什么。给模块命名时也应遵循上述 约定。 每个函数都应包含简要地阐述其功能的注释,该注释应紧跟在函数定义后面,并采用文档字符串格式。文档良好的函数让其他程序员只需阅读文档字符串中的描述就能够使用 它:他们完全可以相信代码如描述的那样运行;只要知道函数的名称、需要的实参以及返回值的类型,就能在自己的程序中使用它。 给形参指定默认值时,等号两边不要有空格: def function_name(parameter_0, parameter_1='default value') 对于函数调用中的关键字实参,也应遵循这种约定: function_name(value_0, parameter_1='value') 建议代码行的长度不要超过79字符,这样只要编辑器窗口适中,就能看到整行代码。如果形参很多,导致函数定义的长度超过了 79字符,可在函数定义中输入左括号后按回车键,并在下一行按两次Tab键,从而将形参列表和只缩进一层的函数体区分开来。 大多数编辑器都会自动对齐后续参数列表行,使其缩进程度与你给第一个参数列表行指定的缩进程度相同: def function_name( parameter_0, parameter_1, parameter_2, parameter_3, parameter_4, parameter_5): function baby... 如果程序或模块包含多个函数,可使用两个空行将相邻的函数分开,这样将更容易知道前一个函数在什么地方结束,下一个函数从什么地方开始。 所有的import 语句都应放在文件开头,唯一例外的情形是,在文件开头使用了注释来描述整个程序。
|