博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python函数
阅读量:6190 次
发布时间:2019-06-21

本文共 4838 字,大约阅读时间需要 16 分钟。

1. 定义函数

函数是带名字的代码块,用于完成具体的工作。

要执行函数定义的特定任务,可调用该函数。

# 定义函数def greet_user():    print("Hello!")# 调用函数    greet_user()# Hello!
# 向函数传递参数def greet_user(username):    print("Hello, " + username.title() + "!")greet_user('jesse')# Hello, Jesse!

2. 传递参数

2.1 位置实参

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')# I have a hamster.# My hamster's name is Harry.

2.2 可变参数

def make_pizza(*toppings):    print(toppings)make_pizza('pepperoni')make_pizza('mushrooms', 'green peppers', 'extra cheese')# ('pepperoni',)# ('mushrooms', 'green peppers', 'extra cheese')

形参名*toppings中的星号让Python创建一个名为toppings的空元组,并将收到的所有值都封装到这个元组中。

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')# Making a 16-inch pizza with the following toppings:# - pepperoni# Making a 12-inch pizza with the following toppings:# - mushrooms# - green peppers# - extra cheese

将接纳任意数量实参的形参放在最后。Python先匹配位置实参和关键字实参,再将余下的实参都收集到最后一个形参中。

2.3 关键字实参

关键字实参是传递给函数的名称-值对。

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(pet_name='harry', animal_type='hamster')# I have a hamster.# My hamster's name is Harry.

注意:使用关键字实参时,务必准确地指定函数定义中的形参名。

>>> def person(name, age, **kw):        print('name:', name, 'age:', age, 'other:', kw)    >>> person('Michael', 30)name: Michael age: 30 other: {}>>> person('Bob', 35, city='Beijing')name: Bob age: 35 other: {'city': 'Beijing'}>>> person('Adam', 45, gender='M', job='Engineer')name: Adam age: 45 other: {'gender': 'M', 'job': 'Engineer'}
>>> extra = {'city': 'Beijing', 'job': 'Engineer'}>>> person('Jack', 24, city=extra['city'], job=extra['job'])name: Jack age: 24 other: {'city': 'Beijing', 'job': 'Engineer'}
>>> extra = {'city': 'Beijing', 'job': 'Engineer'}>>> person('Jack', 24, **extra)name: Jack age: 24 other: {'city': 'Beijing', 'job': 'Engineer'}

注意:关键字参数kw获得的字典是extra的一份拷贝,对kw的改动不会影响到函数外的extra

>>> def person(name, age, *, city, job): # 限制关键字参数的名字        print(name, age, city, job)    >>> person('Jack', 24, city='Beijing', job='Engineer')Jack 24 Beijing Engineer>>> person('Jack', 24, province='Guangdong', job='Engineer')Traceback (most recent call last):  File "
", line 1, in
person('Jack', 24, province='Guangdong', job='Engineer')TypeError: person() got an unexpected keyword argument 'province'
>>> def person(name, age, *args, city, job): # args是可变参数,city和job是关键字参数        print(name, age, args, city, job)    >>> person('Jack', 24, 'Guangdong', city='Guangzhou', job='Engineer')Jack 24 ('Guangdong',) Guangzhou Engineer>>> person('Jack', 24, 'Guangdong', 170, city='Guangzhou', job='Engineer')Jack 24 ('Guangdong', 170) Guangzhou Engineer>>> person('Jack', 24, city='Guangzhou', job='Engineer')Jack 24 () Guangzhou Engineer

2.4 默认值

def describe_pet(pet_name, animal_type='dog'):    print("\nI have a " + animal_type + ".")    print("My " + animal_type + "'s name is " + pet_name.title() + ".")describe_pet(pet_name='willie')# describe_pet('willie')# I have a dog.# My dog's name is Willie.

Python将实参pet_name视为位置实参。

注意:使用默认值时,在形参列表中必须先列出没有默认值的形参,再列出有默认值的形参。这让Python依然能够正确地解读位置实参。

2.4.1 使用默认参数的坑

>>> def add_end(L=[]):        L.append('END')        return L>>> add_end()['END']>>> add_end()['END', 'END']

定义默认参数要牢记一点:默认参数必须指向不变对象!

>>> def add_end(L=None):        if L is None:            L = []        L.append('END')        return L>>> add_end()['END']>>> add_end()['END']

2.5 传递列表

def greet_users(names):    for name in names:        msg = "Hello, " + name.title() + "!"        print(msg)usernames = ['hannah', 'ty', 'margot']greet_users(usernames)# Hello, Hannah!# Hello, Ty!# Hello, Margot!

向函数传递列表的副本而不是原件,这样函数所做的任何修改都只影响副本,而丝毫不影响原件。

3. 返回值

def get_formatted_name(first_name, last_name):    full_name = first_name + ' ' + last_name    return full_name.title()musician = get_formatted_name('jimi', 'hendrix')print(musician)# Jimi Hendrix

函数可返回任何类型的值,包括列表和字典等较复杂的数据结构。

def build_person(first_name, last_name):    person = {'first':first_name, 'last':last_name}    return personmusician = build_person('jimi', 'hendrix')print(musician)# {'first': 'jimi', 'last': 'hendrix'}
def build_person(first_name, last_name, age=''):    person = {'first':first_name, 'last':last_name}    if age:        person['age'] = age    return personmusician = build_person('jimi', 'hendrix', age=27)print(musician)# {'first': 'jimi', 'last': 'hendrix', 'age': 27}

参考资料:

  • 《Python编程从入门到实践》——【美】Eric Matthes 著

转载于:https://www.cnblogs.com/gzhjj/p/10660481.html

你可能感兴趣的文章
HDFS体系结构详解
查看>>
linux下搭建apache+mysql+php环境(LAMP)
查看>>
我的友情链接
查看>>
SQL Server insert的触发器
查看>>
我的友情链接
查看>>
Zabbix3 ——Server端的安装配置小结
查看>>
一周第三次课(10月18日)
查看>>
mybash的实现
查看>>
卷影副本(Shadow Copies)
查看>>
Windows和Linux DNS Cache清理
查看>>
Hbase shell 常用命令
查看>>
世界之窗浏览器 v 3.6.1.0 [官方最新版]
查看>>
DDoS***
查看>>
Sql Server系列:数据表操作
查看>>
Shell语法中的循环
查看>>
Elasticsearch 备份数据到 AWS S3
查看>>
zabbix从入门到精通之---Zabbix proxy的配置(一)
查看>>
Dubbo/ Spring Cloud 分布式事务管理 LCN方式
查看>>
我的友情链接
查看>>
hudson构建配置
查看>>