Python学习笔记
- 一、定义函数
- 二、传递实参
- 三、返回值
- 四、传递列表
- 五、传递任意数量的实参
- 六、将函数存储在模块中
一、定义函数
- 使用关键字 def 来定义函数
- 形参:函数完成其工作所需的一项信息
- 实参:调用函数时传递给函数的信息
def greet_user(user_name): #此处user_name为形参
print("Hello, " + user_name.title() + '!')
greet_user('jeese') #此处'jeese'为实参
输出结果为:
Hello, Jeese!
- 在greet_user( ‘jeese’ )中,将实参 ‘jeese’ 传递给了函数greet_user(),这个值被存储在形参user_name中。
1、位置实参
- 基于实参的顺序关联到形参上
def describe_pet(animal_type, pet_name):
print("nI have a " + animal_type +'.')
print("My " + animal_type + "'s name is " + pet_name)
describe_pet('dog', 'jianhuang') #按顺序输入实参
输出结果为:
I have a dog.
My dog's name is jianhuang
2、关键字实参
- 关键字实参是传递给函数的名称-值对
- 直接在实参中将名称和值关联起来
- 关键字实参无需考虑函数调用中的实参顺序,还清楚地指出了函数调用中各个值的用途
def describe_pet(animal_type, pet_name):
print("nI have a " + animal_type +'.')
print("My " + animal_type + "'s name is " + pet_name)
describe_pet( pet_name='jianhuang', animal_type='dog')
输出结果为:
I have a dog.
My dog's name is jianhuang
3、默认值
- 编写函数时,可给每个形参指定默认值
- 在调用函数中给形参提供了实参时,Python会使用指定的实参值,否则将使用形参的默认值
- 使用默认值时,在形参列表中必须先列出没有默认值的形参,再列出有默认值的形参,这让Python依然能够正确的解读位置实参
def describe_pet(pet_name, animal_type = 'dog'):
print("nI have a " + animal_type +'.')
print("My " + animal_type + "'s name is " + pet_name)
describe_pet('jianhuang') #pet_name的位置形参
输出结果为:
I have a dog.
My dog's name is jianhuang
4、等效的函数调用
- 灵活搭配
def describe_pet(pet_name, animal_type = 'dog'):
print("nI have a " + animal_type +'.')
print("My " + animal_type + "'s name is " + pet_name)
describe_pet('jianhuang')
describe_pet(pet_name='jianhuang')
describe_pet('jianhuang', 'hamster')
describe_pet(pet_name = 'jianhuang', animal_type = 'dog')
describe_pet(animal_type = 'dog', pet_name = 'jianhuang')
输出结果为:
I have a dog.
My dog's name is jianhuang
I have a dog.
My dog's name is jianhuang
I have a hamster.
My hamster's name is jianhuang
I have a dog.
My dog's name is jianhuang
I have a dog.
My dog's name is jianhuang
- 注意形参和实参相匹配(个数、位置)
1、返回简单值
- 使用return语句将值返回到调用函数的代码行
2、可选实参
- 给形参指定默认值——空字符串,让用户在没有提供相应实参时,不使用该实参
- Python将非空字符串解读为True
def get_formatted_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.title()
musician = get_formatted_name('jimi','hendrix')
print(musician)
musician = get_formatted_name('john', 'hooker', 'lee')
print(musician)
输出结果为:
Jimi Hendrix
John Lee Hooker
3、返回字典
def build_person(first_name, last_name, age = ''):
person = {'first':first_name, 'last':last_name,}
if age:
person['age'] = age
return person
musician = build_person('jimi', 'hendrix', age=18)
输出结果为:
print(musician)
{'first': 'jimi', 'last': 'hendrix', 'age': 18}
4、结合使用函数和while循环
def get_formatted_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 '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_formatted_name(f_name, l_name)
print("nHello, " + formatted_name + "!")
输出结果为:
Please tell me your name:
(Enter 'q' at any time to quit)
First name: Xiao
Last name: Ming
Hello, Xiao Ming!
Please tell me your name:
(Enter 'q' at any time to quit)
First name: q
或者定义一个标志来退出循环:
def get_formatted_name(first_name, last_name):
full_name = first_name + ' ' + last_name
return full_name.title()
positive_active = '' #定义一个标志
while not positive_active:
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_name + "!")
positive_active = input("键入任何值以退出,键入回车继续填写:n")
输出结果为:
Please tell me your name:
First name: Xiao
Last name: Ming
Hello, Xiao Ming!
键入任何值以退出,键入回车继续填写:
Please tell me your name:
First name: Xiao
Last name: Gang
Hello, Xiao Gang!
键入任何值以退出,键入回车继续填写:
12331
四、传递列表
- 将复杂任务划分成一系列的步骤
def print_models(unprinted_models, completed_models):
while unprinted_models:
current_design = unprinted_models.pop()
print("Printing model: " + current_design)
completed_models.append(current_design)
def show_completed_models(completed_models):
print("nThe followinf models have been printed: ")
for completed_model in completed_models:
print(completed_model)
unprinted_models = ['iphone case', 'robot pendant', 'dodecahedron']
completed_models = []
print_models(unprinted_models, completed_models)
show_completed_models(completed_models)
输出结果为:
Printing model: dodecahedron
Printing model: robot pendant
Printing model: iphone case
The followinf models have been printed:
dodecahedron
robot pendant
iphone case
1、全局变量和局部变量
- 全局变量和局部变量的区别在于作用域
- 全局变量在整个py文件中声明,全局范围内可以使用
- 局部变量是在某个函数内部声明的,只能在函数内部使用,如果超出使用范围(函数外部),则会报错
- 以上代码中,unprinted_models和completed_models均为全局变量,因此可以不用在函数中使用return输出便可直接使用
- 一个函数只能return一个变量、列表、字典,其余结果可使用print函数直接打印
#以下代码由于未使用return而报错
A = 100
def sum():
a = 50
print(A+a)
sum()
print(A)
print(a)
输出结果为:
150
100
Traceback (most recent call last):
File "D:Python_WorkPython学习Python编程-从入门到实践练习.py", line 7, in
print(a)
NameError: name 'a' is not defined
#以下代码改进后全部输出
A = 100
def sum():
a = 50
print(A+a)
return a
a = sum()
print(A)
print(a)
输出结果为:
150
100
50
2、禁止函数修改列表
- 使用切片表示法创建列表副本
- 列表 list[:] 为列表 list 的副本,两者修改并不关联
1、结合使用位置实参和任意数量实参
- 使用 *variable 来传递任意数量的 非关键字实参
- *variable 让Python创建一个名为variable的空元组,并将收到的所有值都封装到这个元组中
#元组示例
def make_pizza(size, *toppings):
print("nMaking a " + str(size) + "-inch pizza with the following toppings: ")
print(toppings)
make_pizza(12, 'pepperoni')
make_pizza(15, 'mushrooms','green peppers','extra cheese')
输出结果为:
Making a 12-inch pizza with the following toppings:
('pepperoni',)
Making a 15-inch pizza with the following toppings:
('mushrooms', 'green peppers', 'extra cheese')
2、使用任意数量的关键字实参
- 使用 **variable 来传递任意数量的的 关键字实参
- **variable中的两个星号让Python创建一个名为variable的空字典,并将收到的所有名称-值对都封装到这个字典中
#字典示例
def build_profile(first, last, **user_info):
profile = {}
profile['First name'] = first.title()
profile['Last name'] = last.title()
for key, value in user_info.items():
profile[key.title()] = value.title()
return profile
user_profile = build_profile('albert', 'einstein',
location = 'princeton',
field = 'physics')
print(user_profile)
输出结果为:
{'First name': 'Albert', 'Last name': 'Einstein', 'Location': 'Princeton', 'Field': 'Physics'}
- 希望使用任意数量的非关键字实参时,使用 *variable , 希望使用任意数量的关键字实参时,使用 **variable
| 语法 | 描述 |
|---|---|
| import module_name | 导入模块module_name,若想使用模块中的函数,使用:module_name.function_name() |
| from module_name import function_name | 导入模块中的函数,可以直接使用 |
| from module_name import function_name as fn | 使用as给函数指定别名(同样可以使用as给模块指定别名) |
| from module_name import * | 导入模块中的所有函数 |
注:
- 给形参指定默认值、调用关键字实参时,等号两边不要有空格



