函数
定义函数
一个简单函数
"""
def 是为了告知 python 你要开始定义函数了
greet_user是函数名
name是形参,有些函数是没有形参, 形参的生命期仅限于函数以内
"""
def greet_user(name): # 注意冒号
""" 打印问候语, 一般的函数都会有函数作用的说明"""
print(f"Hello! {name}.")
# 有时这里需要返回值
name1 = input("What's your name?")
greet_user(name1)
"""
调用函数,name1为实参,由于形参的生命期只在函数内,所以这个name1 可以换成 name
"""

传递实参
位置实参
用这种方式来传递实参要求实参和形参的顺序一样,因此使用这种方式需要格外小心。
如果顺序错误就会引起名字变成种类名之类的错误
def describe_pet(animal_type, pet_name):
"""显示宠物信息"""
print(f"I have a {animal_type}.")
print(f"My {animal_type}'s name is {pet_name.title()}")
describe_pet('hamster', 'harry')
# 如果顺序错误会这样
print()
describe_pet('harry', 'hamster')

关键字实参
关键字实参是传递给函数的名称值对。
因为直接在实参中将名称和值关联起来,所以即使顺序变化传递实参时也不会混淆。
def describe_pet(animal_type, pet_name):
"""显示宠物信息"""
print(f"I 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(pet_name, animal_type='dog'):
# 上面这个动物种类默认为dog
"""显示宠物信息"""
print(f"I have a {animal_type}.")
print(f"My {animal_type}'s name is {pet_name.title()}")
# 提供了形参,所以会忽略掉默认参数
describe_pet(animal_type='hamster', pet_name='harry')
# 由于对动物类型指定了默认值,故只使用一个petname参数也是可以运行的
describe_pet(pet_name='lisa')
describe_pet('david') # 最简单的调用
常见的参数错误
实参数量不够或太多
采用位置实参时,实参顺序错误
非默认形参在默认形参后面
返回值
返回简单值
def get_formatted_name(first_name, last_name):
""" 返回整洁的姓名"""
full_name = f"{first_name} {last_name}"
return full_name.title()
# return 返回值
musician = get_formatted_name("jimi", 'hendrix')
print(musician)
让实参变成可选的
有时需要将实参变成可选的,但是python没有函数重载的定义,所以可以采用默认值来让实参变得可选
def get_formatted_name(first_name, last_name, middle_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()
# return 返回值
first = input("first_name = \n")
middle = input("middle_name = (if you don't have, you can ignore it)\n")
last = input("last_name = \n")
if middle:
musician = get_formatted_name(first, last, middle)
else:
musician = get_formatted_name(first, last)
print(musician)
返回字典
函数可以返回任何类型的值,包括列表和字典等比较复杂的数据结构
def build_person(first_name, last_name):
person = {'first': first_name, "last": last_name}
return person
传递列表
向函数传递列表会很有用,其中包括名字,数或者更复杂的对象,
在学到算法时的,比如说要排序一个数组(也是数值列表)
在函数中修改列表
将列表传给函数后,函数就可以对其进行修改。函数对其的任何修改都是永久性的
如果不希望修改,可以只是传递列表的副本(注意是切片,忘记了就取看组织列表)
以冒泡排序为例
def bubbleSort(arr):
n = len(arr)
# 遍历所有数组元素
for i in range(n):
# Last i elements are already in place
for j in range(0, n - i - 1):
if arr[j] > arr[j + 1]:
arr[j], arr[j + 1] = arr[j + 1], arr[j]
arr = []
n = int(input("请输入数组长度:\n"))
i = 0
while i < n:
arr.append(int(input()))
i += 1
bubbleSort(arr)
print("排序后的数组:")
for i in range(n):
print("%d" % arr[i])
传递任意数量的实参
形参名 *toppings中的星号让python创建一个名为toppings的元组,
并把收到的所有值都封装到这个元组中
def make_pizza(*toppings):
print(toppings)
make_pizza('mushrooms')
make_pizza('green peppers', 'mushroom', 'extra cheese')

结合使用位置实参和任意位置数量实参
def make_pizza(size, *toppings):
print(f"Making a {size}-inch pizza with the following toppings:")
for topping in toppings:
print(f'- {topping}')
make_pizza(16,'mushrooms')
make_pizza(12,'green peppers', 'mushroom', 'extra cheese')

使用任意数量的关键字实参
def build_profile(first, last, **user_info):
"""
**user_info 是让python创建一个名为user_info的字典
并将所接收到的所有键值对都存放进去
"""
user_info["first_name"] = first
user_info["last_name"] = last
# 将 first 和 last 也存入字典中
return user_info
user_profile = build_profile('albert', 'einstein',
location='princeton',
field='physics')
print(user_profile)
将函数存储在模块中
使用函数的优点之一,可以实现代码块与主程序分离。
可以更进一步,将函数存于名为模块的独立文件中,再将模块导入到主程序中
import语句允许在当前运行的程序文件中使用模块中的代码
导入整个模块
要让函数是可导入的,得先创建模块。
模块是后缀名 .py 的文件,一般也在主程序当前文件中
使用module_name.function_name()来使用导入模块的任何一个函数



导入特定的函数
可以导入模块中的特定函数,这种导入方法如下:
from module_name import function_1, function_2
这时候对应的语法就要发生变化

使用这种方法调用函数无需使用句点
使用as 给函数指定别名
别名——函数的另一个名称,类似于外号,不过这个外号要独一无二
一般在函数名很长的时候使用

使用as 给模块指定别名

导入模块中的所有函数
使用星号(*)运算符可以导入模块中的所有函数

浙公网安备 33010602011771号