Python3 函数

逆流者 2020年11月03日 65次浏览

定义函数

def 函数名(参数列表):
    函数体

看一个例子:

# 定义函数
def greet_user():
    """显示简单的问候语"""
    print("hello")

greet_user()

运行结果:

hello
  • """显示简单的问候语""" 文档注释

向函数传递信息

# 向函数传递信息
def greet_user(username):
    """显示简单的问候语"""
    print("Hello, " + username.title() + "!")

greet_user('tom')

运行它:

Hello, Tom!

实参和形参

在上面的例子中, 定义的函数greet_user(username), username 是一个形参, 在greet_user('tom') 传入的tom就是一个实参了.

传递实参

位置实参

# 位置实参
def describe_pet(animal_type, pet_name):
    """显示宠物的信息"""
    print("我的 " + animal_type + ' 的名字是 ' + pet_name)

describe_pet('狗', '小黄')
describe_pet('猫', '小黑')
我的 狗 的名字是 小黄
我的 猫 的名字是 小黑

需要注意的是, 传入的实参要和定义的形参位置一一对应, 顺序很重要!

关键字实参

def describe_pet(animal_type, pet_name):
    """显示宠物的信息"""
    print("我的 " + animal_type + ' 的名字是 ' + pet_name)


describe_pet(pet_name='小红', animal_type='鸡')
我的 鸡 的名字是 小红

默认值

# 默认值 默认值放在后面
def describe_pet2(pet_name, animal_type='dog'):
    """显示宠物的信息"""
    print("我的 " + animal_type + ' 的名字是 ' + pet_name)

describe_pet2(pet_name='小黄')
describe_pet2('大黄')
describe_pet2('大黄2', '狗')
我的 dog 的名字是 小黄
我的 dog 的名字是 大黄
我的 狗 的名字是 大黄2

需要注意的是: 使用默认值时, 在形参列表中必须先列出没有默认值的形参, 再列出有默认值的形参. 这样能让Python正确的读取位置参数.

否则会报错:

SyntaxError: non-default argument follows default argument

返回值

返回简单值

# 返回值
def get_formatted_name(frist_name, last_name):
    """返回整洁的姓名"""
    full_name = frist_name + ' ' + last_name
    return full_name.title()

# 函数调用
musician = get_formatted_name('jimi', 'hendrix')
print(musician)
Jimi Hendrix

返回字典

# 返回字典
def build_person(frist_name, last_name):
    """返回一个字典, 其中包含一个人的信息"""
    person = {'first': frist_name, 'last': last_name}
    return person

musician = build_person('jimi', 'hendrix')
print(musician)
{'first': 'jimi', 'last': 'hendrix'}

传递列表

在函数中修改列表

# 在函数中修改列表
def print_models(unprinted_designs, completed_models):
    """
    模拟打印每个设计, 直到没有末打印的设计为止
    打印每个设计后, 都将其移到列表completed_models中
    """

    while unprinted_designs:
        current_design = unprinted_designs.pop()

        # 模拟根据设计制作3D打印模型的过程
        print('打印 模型: ' + current_design)
        completed_models.append(current_design)

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('打印前 未打印的列表: ')
print(unprinted_designs)
print_models(unprinted_designs, completed_models)
show_completed_models(completed_models)
print('打印后 未打印的列表: ')
print(unprinted_designs)
打印前 未打印的列表: 
['iphone case', 'robot pendant', 'dodecahedron']
打印 模型: dodecahedron
打印 模型: robot pendant
打印 模型: iphone case

打印好的所有模型:
dodecahedron
robot pendant
iphone case
打印后 未打印的列表: 
[]

我们发现未打印的列表unprinted_designs打印之后变成空列表了, 因为传递给函数print_models(unprinted_designs, completed_models)的unprinted_designs列表是它本身, 函数中做的pop()操作会影响到外面, 那如果打印不影响传入的unprinted_designs列表怎么做?

禁止函数修改列表

只要把上面的例子函数print_models(unprinted_designs, completed_models)把传入的unprinted_designs改成传入副本unprinted_designs[:]就可以满足.

完整示例:

# 在函数中修改列表
def print_models(unprinted_designs, completed_models):
    """
    模拟打印每个设计, 直到没有末打印的设计为止
    打印每个设计后, 都将其移到列表completed_models中
    """

    while unprinted_designs:
        current_design = unprinted_designs.pop()

        # 模拟根据设计制作3D打印模型的过程
        print('打印 模型: ' + current_design)
        completed_models.append(current_design)

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('打印前 未打印的列表: ')
print(unprinted_designs)
# unprinted_designs[:] 这个表示 unprinted_designs 列表的副本, 不会改变原来unprinted_designs的数据
print_models(unprinted_designs[:], completed_models)
show_completed_models(completed_models)

print('打印后 未打印的列表: ')
print(unprinted_designs)
打印前 未打印的列表: 
['iphone case', 'robot pendant', 'dodecahedron']
打印 模型: dodecahedron
打印 模型: robot pendant
打印 模型: iphone case

打印好的模型:
dodecahedron
robot pendant
iphone case
打印后 未打印的列表: 
['iphone case', 'robot pendant', 'dodecahedron']

传递任意参数的实参

  • *变量 可以接收任意参数的实参
# 传递任意参数的实参 *toppings
def make_pizza(*toppings):
    print(toppings)

make_pizza('peperoni')
make_pizza('mushrooms', 'green peppers', 5)
('peperoni',)
('mushrooms', 'green peppers', 5)

看打印的结果实际上是 使用元祖来存储 任意数量的实参的

使用位置实参和任意数量实参

# 使用位置实参和任意数量实参
def make_pizza(size, *toppings):
    print(size)
    print(toppings)

make_pizza(16, 'green peppers', 'mushrooms')
16
('green peppers', 'mushrooms')

使用任意数量的关键字实参

# 使用任意数量的关键字实参
def build_profile(first, last, **user_info):
    """创建一个字典,包含我们知道的有关用户的一切"""
    profile = {}
    profile['frist_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)
{'frist_name': 'albert', 'last_name': 'einstein', 'location': 'princeton', 'field': 'physics'}

将函数存储在模块中

导入整个模块

模块: pizza.py

def make_pizza(size, *toppings):
    print(size)
    print(toppings)

在pizza.py的所在目录下创建making_pizzas.py文件, 我们在making_pizzas.py文件中导入pizza模块

making_pizzas.py

# 导入整个模块
import pizza

pizza.make_pizza(16, 'green peppers', 'mushrooms')
16
('green peppers', 'mushrooms')

导入特定函数

from module_name import function_name
  • module_name 模块名
  • function_name 函数名

如果要导入模块中多个函数, 可以这样:

from module_name import function_1, function_2, function_3

看一个示例:

# 导入特定函数
from pizza import make_pizza

make_pizza(16, 'green peppers', 'mushrooms')

使用as给函数指定别名

# 使用as给函数指定别名
from pizza import make_pizza as mp

mp(16, 'green peppers', 'mushrooms')

使用as给模块指定别名

# 使用as给模块指定别名
import pizza as p

p.make_pizza(16, 'green peppers', 'mushrooms')

导入模块中所有函数

# 导入模块中所有函数
from pizza import *

make_pizza(16, 'green peppers', 'mushrooms')
make_pizza(20, 'green peppers', 'mushrooms')

Python3 目录

  1. Python3 教程
  2. Python3 变量和简单数据类型
  3. Python3 列表
  4. Python3 操作列表
  5. Python3 if 语句
  6. Python3 if 字典
  7. Python3 用户输入和while循环
  8. Python3 函数
  9. Python3 类
  10. Python3 文件和异常
  11. Python3 测试代码
  12. Python3 使用matplotlib绘制图表
  13. Python3 使用Pygal生成矢量图形文件
  14. Python3 使用csv模块处理CSV(逗号分割的值)格式存储的天气数据
  15. Python3 处理JSON格式数据(制作交易收盘价走势图)
  16. Python3 使用API