1 # 传递任意数量的实参
2 def make_pizza(size, *toppings): # 重点 必须在函数定义中将接纳任意数量实参的形参放在最后
3 """概述要制作的比萨"""
4 print("\nMaking a " + str(size) +
5 "-inch pizza with the following toppings:")
6 for topping in toppings:
7 print("- " + topping)
8
9
10 make_pizza(16, 'pepperoni')
11 make_pizza(12, 'mushrooms', 'green peppers', 'extra cheese')
12
13
14 def build_profile(first, last, **user_info):
15 """创建一个字典,其中包含我们知道的有关用户的一切"""
16 profile = {}
17 profile['first_name'] = first # 将名和姓加入到这个字典中,因为我们总是会从用户那里收到这两项信息。
18 profile['last_name'] = last
19 for key, value in user_info.items():
20 profile[key] = value # 遍历字典user_info 中的键—值对,并将每个键—值对都加入到字典profile 中。
21 return profile
22
23 #
24 user_profile = build_profile('albert', 'einstein',
25 location='princeton',
26 field='physics')
27 print(user_profile)
28
29
30
31 #练习8-12 p77
32 def make_sandwich(*toppings):
33 print("Your sandwich is make with following toppings:")
34 for topping in toppings:
35 print("- " + topping)
36
37 # TypeError: can only concatenate str (not "list") to str
38 #test = ["aa","bb","cc"] # TypeError: can only concatenate str (not "list") to str
39 #test = ("aa","bb","cc") # TypeError: can only concatenate str (not "tuple") to str
40 #make_sandwich(test) # 向函数传递的必须是实参
41 make_sandwich("aa","bb","vv","asd")
42 make_sandwich("bob")
43 make_sandwich("qead")
44
45 def build_profile(first, last, **user_info):
46 """创建一个字典,其中包含我们知道的有关用户的一切"""
47 profile = {}
48 profile['first_name'] = first
49 profile['last_name'] = last
50 for key, value in user_info.items():
51 profile[key] = value
52 return profile
53
54 my_intro = build_profile("Yibao","Ryo",sex= "man",country="China",age="27")
55 print(my_intro)
56
57
58 def make_car(maker,type,**car_info): # 此处car_infos为字典 用for key,value car_info.item()添加键-值
59 car = {}
60 car['maker'] = maker
61 car['type'] = type
62 for key,value in car_info.items():
63 #car_info[key] = value # 此处注意储存键值的字典名
64 car[key] = value
65 return car
66
67 car = make_car('subaru', 'outback', color='blue', tow_package=True)
68 print(car)
69
70 import pizza
71
72 pizza.make_pizza(16, 'pepperoni')
73 pizza.make_pizza(12, 'mushrooms', 'green peppers', 'extra cheese')
74
75 """
76 ## 8.6.2 导入特定的函数
77
78 你还可以导入模块中的特定函数,这种导入方法的语法如下:
79 from module_name import function_name
80 通过用逗号分隔函数名,可根据需要从模块中导入任意数量的函数:
81 from module_name import function_0, function_1, function_2
82
83 8.6.3 使用as 给函数指定别名
84 如果要导入的函数的名称可能与程序中现有的名称冲突,或者函数的名称太长,可指定简短而独一无二的别名 ——函数的另一个名称,类似于外号。要给函数指定这种特殊外
85 号,需要在导入它时这样做。
86 下面给函数make_pizza() 指定了别名mp() 。这是在import 语句中使用make_pizza as mp 实现的,关键字as 将函数重命名为你提供的别名:
87 from pizza import make_pizza as mp
88 mp(16, 'pepperoni')
89 mp(12, 'mushrooms', 'green peppers', 'extra cheese')
90
91 上面的import 语句将函数make_pizza() 重命名为mp() ;在这个程序中,每当需要调用make_pizza() 时,都可简写成mp() ,而Python将运行make_pizza() 中的代
92 码,这可避免与这个程序可能包含的函数make_pizza() 混淆。
93 指定别名的通用语法如下:
94 from module_name import function_name as fn
95
96 8.6.4 使用as 给模块指定别名
97 你还可以给模块指定别名。通过给模块指定简短的别名(如给模块pizza 指定别名p ),让你能够更轻松地调用模块中的函数。相比于pizza.make_pizza()
98 ,p.make_pizza() 更为简洁:
99 import pizza as p
100 p.make_pizza(16, 'pepperoni')
101 p.make_pizza(12, 'mushrooms', 'green peppers', 'extra cheese')
102 上述import 语句给模块pizza 指定了别名p ,但该模块中所有函数的名称都没变。调用函数make_pizza() 时,可编写代码p.make_pizza() 而不
103 是pizza.make_pizza() ,这样不仅能使代码更简洁,还可以让你不再关注模块名,而专注于描述性的函数名。这些函数名明确地指出了函数的功能,对理解代码而言,它们
104 比模块名更重要。
105 给模块指定别名的通用语法如下:
106 import module_name as mn
107
108 8.6.5 导入模块中的所有函数
109 使用星号(* )运算符可让Python导入模块中的所有函数:
110 from pizza import *
111 make_pizza(16, 'pepperoni')
112 make_pizza(12, 'mushrooms', 'green peppers', 'extra cheese')
113 import 语句中的星号让Python将模块pizza 中的每个函数都复制到这个程序文件中。由于导入了每个函数,可通过名称来调用每个函数,而无需使用句点表示法。然而,使用
114 并非自己编写的大型模块时,最好不要采用这种导入方法:如果模块中有函数的名称与你的项目中使用的名称相同,可能导致意想不到的结果:Python可能遇到多个名称相同的函
115 数或变量,进而覆盖函数,而不是分别导入所有的函数。
116 最佳的做法是,要么只导入你需要使用的函数,要么导入整个模块并使用句点表示法。这能让代码更清晰,更容易阅读和理解。这里之所以介绍这种导入方法,只是想让你在阅
117 读别人编写的代码时,如果遇到类似于下面的import 语句,能够理解它们:
118 from module_name import *
119 """
120
121 """8.7 函数编写指南
122 编写函数时,需要牢记几个细节。应给函数指定描述性名称,且只在其中使用小写字母和下划线。描述性名称可帮助你和别人明白代码想要做什么。给模块命名时也应遵循上述
123 约定。
124 每个函数都应包含简要地阐述其功能的注释,该注释应紧跟在函数定义后面,并采用文档字符串格式。文档良好的函数让其他程序员只需阅读文档字符串中的描述就能够使用
125 它:他们完全可以相信代码如描述的那样运行;只要知道函数的名称、需要的实参以及返回值的类型,就能在自己的程序中使用它。
126 给形参指定默认值时,等号两边不要有空格:
127 def function_name(parameter_0, parameter_1='default value')
128 对于函数调用中的关键字实参,也应遵循这种约定:
129 function_name(value_0, parameter_1='value')
130 PEP 8(https://www.python.org/dev/peps/pep-0008/ )建议代码行的长度不要超过79字符,这样只要编辑器窗口适中,就能看到整行代码。如果形参很多,导致函数定义的长度超过了
131 79字符,可在函数定义中输入左括号后按回车键,并在下一行按两次Tab键,从而将形参列表和只缩进一层的函数体区分开来。
132 大多数编辑器都会自动对齐后续参数列表行,使其缩进程度与你给第一个参数列表行指定的缩进程度相同:
133 def function_name(
134 parameter_0, parameter_1, parameter_2,
135 parameter_3, parameter_4, parameter_5):
136 function body...
137 如果程序或模块包含多个函数,可使用两个空行将相邻的函数分开,这样将更容易知道前一个函数在什么地方结束,下一个函数从什么地方开始。
138 所有的import 语句都应放在文件开头,唯一例外的情形是,在文件开头使用了注释来描述整个程序。
139
140 import module_name
141 from module_name import function_name
142 from module_name import function_name as fn
143 import module_name as mn
144 from module_name import *
145
146 第9章,你将学习编写类。类将函数和数据整洁地封装起来,让你能够灵活而高效地使用它们