一个函数

1
2
3
4
5
def hello(name):    # <== 形参——函数完成某项工作所需的一项信息用来接收传递的实参
print("你好," + name) # <== 函数体


hello("张瑞鑫") # <== 实参——调用函数后传递给函数的信息

关键字实参

函数调用中实参绑定一个形参

使用关键字形参 务必准确指定形参名

1
2
3
4
5
6
7
8
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') # 告诉python实参传递给谁
describe_pet(pet_name='harry', animal_type='hamster') # 实参换位置等效
# 1·位置实参实参

实参是函数调用时配置的 形参是实参传递的位置

1
2
3
4
5
6
7
8
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", "bob")
# 2·位置实参

位置实参的顺序很重要 如果顺序不对结果将出乎意料

1
2
3
4
5
6
7
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('harry', 'hamster') # 我有一只harry 名字是仓鼠
# 传递任意数量的实参

在Python允许函数从调用语句中收集任意数量的实参。

1
2
3
4
5
6
7
8
9
# 不管语句调用多少实参 形参toppings*都将他们统统收入囊中
# 形参名*toppings中的星号让Python创建一个名为toppings的空元组 并将所有值封装到这个元组
# 注意 Python将实参封装到一个元组中,即便函数只收到一个值也如此!!!
def make_pizza(*toppings):
"""打印顾客点的所有配料"""
print(toppings)

make_pizza('pepperoni')
make_pizza('mushrooms', 'green peppers', 'extra cheese')

下面将print语句替换为一个循环
对配料列表进行遍历 对顾客点餐进行描述

1
2
3
4
5
6
7
8
def make_pizza(*toppings): 
"""概述要制作的比萨"""
print("\nMaking a pizza with the following toppings:")
for topping in toppings:
print("- " + topping)

make_pizza('pepperoni') # 不管是收到单个值或多个值都能妥善处理
make_pizza('mushrooms', 'green peppers', 'extra cheese')

结合使用位置实参&任意数量实参

Python先匹配位置实参和关键字实参,再将余下的实参都收集到最后一个形参中
例如,如果前面的函数还需要一个表示比萨尺寸的实参,必须将该形参放在形参*toppings的前面:

1
2
3
4
5
6
7
8
9
10
def make_pizza(size, *toppings):
"""概述要制作的比萨"""
print("\nMaking a " + str(size) +
"-inch pizza with the following toppings:")
for topping in toppings:
print("- " + topping)


make_pizza(16, 'pepperoni')
make_pizza(12, 'mushrooms', 'green peppers', 'extra cheese')

编写函数时,你可以以各种方式混合使用位置实参、关键字实参和任意数量的实参
知道这些实参类型大有裨益,因为阅读别人编写的代码时经常会见到它们
要正确地使用这些类型的实参并知道它们的使用时机,需要经过一定的练习。

默认值

设定默认值 通俗点就算可选项

使用默认值时,在形参列表中必须先列出没有默认值的形参,再列出有默认值的实参 这让Python依然能够正确地解读位置实参 可以理解为优先级从左到右 可选项最右


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
def describe_pet(pet_name, animal_type='dog'):  # 这里设置了默认值
"""显示宠物的信息"""
print("\nI have a " + animal_type + ".")
print("My " + animal_type + "'s name is " + pet_name.title() + ".")


# 这里可提供animal_type或不提供

# 一条名为Willie的小狗
describe_pet('willie') # 默认值是dog所以可不填第二形参
describe_pet(pet_name='willie') # 指定实参

# 一只名为Harry的仓鼠
describe_pet('harry', 'hamster') # 按位置传参
describe_pet(pet_name='harry', animal_type='hamster') # 指定实参
describe_pet(animal_type='hamster', pet_name='harry') # 等效

返回值

返回值 通俗来讲函数处理好数据返回到函数调用行具体看示例源码


1
2
3
4
5
6
7
8
def get_formatted_name(first_name, last_name):
"""返回整洁的姓名"""
full_name = first_name + ' ' + last_name # 处理数据赋值左边变量
return full_name.title() # 首字母大写返回到函数调用行


musician = get_formatted_name('jimi', 'hendrix') # 函数返回值 Jimi Hendrix
print(musician)

1
2
3
4
5
6
7
8
def get_formatted_name(first_name, middle_name, last_name):
"""返回整洁的姓名"""
full_name = first_name + ' ' + middle_name + ' ' + last_name # 处理数据赋值左边变量
return full_name.title() # 首字母大写返回到函数调用行


musician = get_formatted_name('john', 'lee', 'hooker') # 函数返回值 John Lee Hooker
print(musician)

可选实参和return

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 定义一个函数包括可选实参

def get_formatted_name(first_name, last_name, middle_name=''): # 空字符串与0相等 0为false 1为true
"""返回整洁的姓名"""

if middle_name: # 判断是否有中间名如果有为true执行if子句 为false执行else子句
full_name = first_name + ' ' + middle_name + ' ' + last_name # 处理数据并复制
else: # 为if为false执行else
full_name = first_name + ' ' + last_name # 名前姓后使用 + 连接起来
return full_name.title() # 返回到调用函数代码行


musician = get_formatted_name('jimi', 'hendrix') # <== 返回到这里 即musician = Jimi Hendrix
print(musician)
musician = get_formatted_name('john', 'hooker', 'lee')# <== 返回到这里 即musician = John Lee Hooker
print(musician)

返回字典

函数可返回任何类型的值 包含列表字典…复杂的数据结构

1
2
3
4
5
6
7
8
def build_person(first_name, last_name):
"""返回一部字典,其中包含有关一个人阿信息"""
person = {'first': first_name, 'last': last_name}
return person # 返回到调用函数代码行


musician = build_person('jimi', 'hendrix')
print(musician)
1
2
3
4
5
6
7
8
9
10
11
12
def build_person(first_name, last_name, age=''):

"""返回一部字典,其中包含有关一个人的信息"""
person = {'first': first_name, 'last': last_name}

if age: # 判断非空字符串时执行子句
person['age'] = age # 添加一个键age值27
return person # 返回到调用代码行


musician = build_person('jimi', 'hendrix', age=str(27))
print(musician)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

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":
print("拜拜")
break
l_name = input("Last_name")
if l_name == "q":
break

formatted_name = get_formatted_name(f_name, l_name)
print("\nHello, " + formatted_name + "!")

将列表传递给函数后 函数能直接访问其内容 高效处理数据

读取列表向每位用户打招呼

1
2
3
4
5
6
7
8
9
def greet_users(names):
"""向列表传中的每位用户大打招呼"""
for name in names:
msg = "你好," + name.title() + "!"
print(msg)


usernames = ['hannah', 'ty', 'margot']
greet_users(usernames)

在函数中修改列表 模拟流程3D打印

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
def print_models(unprinted_designs, completed_models):
"""
模拟打印每个设计 直到未打印全部打印完为止
打印每个设计 将其移到列表completed_models中
"""
while unprinted_designs:
current_design = unprinted_designs.pop() # current_design: 当前设计 unprinted_designs: 未打印设计

# 模拟根据设计制作3D打印的过程
print("正在打印..." + current_design) # 打印当前设计
completed_models.append(current_design) # 添加到列表completed_models


def show_completed_models(completed_models):
"""显示打印好的模型"""
print("\n已打印以下模型")
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)

函数的优点之一是,使用它们可将代码块与主程序分离。
通过将函数存储在独立的文件中,可隐藏程序代码的细节,将重点放在程序的高层逻辑上。

在pycharm新建软件包存放编写好的函数 然后导入调用

1
2
3
4
5
6
常用的几种导入方法:
import module_name # 导入XX模块
from module_name import function_name # 从XX模块导入函数
from module_name import function_name as fn # 从XX模块导入函数重命名
import module_name as mn # as 重命名简写函数 避免混淆
from module_name import * # 从XX模块导入所有函数

函数编写指南

编写函数时 应给函数指定描述性名称,且只在其中使用小写字母和下划线
描述性名称可帮助你和别人明白代码想要做什么。
给模块命名时也应遵循上述约定。
每个函数都应包含简要地阐述其功能的注释 并采用文档字符串紧格式跟函数定义后面

编写一个名为 T_shirt()的函数,它接受一个尺码以及要印到 T 恤上
的字样。这个函数应打印一个句子,概要地说明 T 恤的尺码和字样。

1
2
3
4
5
6
7
8
9
10
print("尺码为\n" + "\tm\l\\xl\\xxl\\xxxl")
print("有以下图案\n" + "\t美女", "帅哥", "劳力士")


def T_shirt(size, style):
print("好的 " + size + ' 的尺码' + style + "的样式\n")


T_shirt(size="xl", style="劳力士")
T_shirt("xxl", "帅哥")

修改函数 T_shirt(),使其在默认情况下制作一件印有字样“I love
Python”的大号 T 恤。调用这个函数来制作如下 T 恤:一件印有默认字样的大号 T 恤、
一件印有默认字样的中号 T 恤和一件印有其他字样的 T 恤(尺码无关紧要)。


1
2
3
4
5
6
7
8
9
10
11
print("尺码为\n" + "\tm\l\\xl\\xxl\\xxxl")
print("有以下图案\n" + "\t美女", "帅哥", "劳力士")


def T_shirt(size="大号", style="Python"):
print("好的 " + size + ' 尺码的' + style + "T-shirt\n")


T_shirt(size="xl", style="劳力士")
T_shirt("xxl", "帅哥")
T_shirt()

编写一个名为 describe_city()的函数,它接受一座城市的名字以及该城
市所属的国家。这个函数应打印一个简单的句子,如 Reykjavik is in Iceland。给用
于存储国家的形参指定默认值。为三座不同的城市调用这个函数,且其中至少有一座城
市不属于默认国家。


1
2
3
4
5
6
7
8
def describe_city(city_name, country="中国"):
print(city_name + "-是" + country + "的")


describe_city("陕西")
describe_city("广岛", "日本")
describe_city(city_name="华盛顿", country="美国")
describe_city(country="德国", city_name="阿尔伯特-爱因斯坦")

编写一个名为 city_country()的函数,它接受城市的名称及其所属的
国家。这个函数应返回一个格式类似于下面这样的字符串


1
2
3
4
5
6
7
8
9
10
11
# "Santiago, Chile"

def city_country(country_name, city_name):
cty = country_name + "," + city_name
return cty


cc_1 = city_country("----------\n中国", "辽宁\n")
cc_2 = city_country("\n中国", "上海\n")
cc_3 = city_country("\n中国", "北京\n----------")
print(cc_1, cc_2, cc_3)

编写一个名为 make_album()的函数,它创建一个描述音乐专辑的字典。
这个函数应接受歌手的名字和专辑名,并返回一个包含这两项信息的字典。使用这个函
数创建三个表示不同专辑的字典,并打印每个返回的值,以核实字典正确地存储了专辑
的信息。
给函数 make_album()添加一个可选形参,以便能够存储专辑包含的歌曲数。如果调用这个函数时指定了歌曲数,就将这个值添加到表示专辑的字典中。调用这个函数,并
至少在一次调用中指定专辑包含的歌曲数


1
2
3
4
5
6
7
8
9
10
11
def make_album(singer_name, album_name, songs_num=''):
album = {"歌手": singer_name, "专辑": album_name}
if songs_num: # 判断非空执行子句
album["歌曲数目"] = songs_num
return album


zj_1 = make_album("邓紫棋", "画")
zj_2 = make_album("林俊杰", "修炼爱情")
zj_3 = make_album("薛之谦", "天外来物", "12")
print('音乐描述\t\n', zj_1, "\n", zj_2, "\n", zj_3)

在为完成上面练习编写的程序中,编写一个 while 循环,让用户
输入一个专辑的歌手和名称。获取这些信息后,使用它们来调用函数 make_album(),并
将创建的字典打印出来。在这个 while 循环中,务必要提供退出途径


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
def make_album(singer_name, album_name, songs_num=''):
album = {"歌手": singer_name, "专辑": album_name}
if songs_num: # 判断非空执行子句
album["歌曲数目"] = songs_num
return album # 返回到函数调用行


while True:
print("按q退出噢")
album_n = input("输入专辑名称")
if album_n == "q":
print("阿里嘎多~")
break
singer_n = input("输入歌手名称")
if singer_n == "q":
break
print(make_album(singer_n, album_n))

魔术师:创建一个包含魔术师名字的列表,并将其传递给一个名为
show_magicians()的函数,这个函数打印列表中每个魔术师的名字


1
2
3
4
5
6
7
8
def show_magicians(names):
print("以下为魔术师名字")
for name in names:
print(name.title(), end=',')


magician = ['a', 'b', 'c', 'd']
show_magicians(magician)

了不起的魔术师

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
def show_magicians(names):
"""传递用户,发出问候"""
print("以下为魔术师名字")
for name in names:
print(name.title(), end=',')


'''大魔术师'''
magicians = ['a', 'b', 'c', 'd']


def make_great(new_magicians):
"""在每个魔术师前加上The Great"""
for i in range(3):
magicians[i] = "The Great " + magicians[i]
print(i) # i从0开始 标记运行情况
print(magicians[i])
return


print(magicians) # 输出的是原始列表数据
print("\n")
show_magicians(magicians) # 调用函数show_magicians,原始数据
print("\n")
make_great(magicians) # 调用修改函数make_great,原始数据改变
print("\n")
show_magicians(magicians) # 调用函数,原始数据列表已经改变
print("\n")
print(magicians) # 输出的是改变的列表数据

# 结论,调用函数先后顺序直接影响最终结果。思路要清晰。本题原意只是操作一个列表。