python学习笔记五——函数

实验环境:anaconda4.6.11

七.函数

1.定义函数

ef greet_user(username):
    """显示简单的问候语"""
    print("你好" + username.title() + "!")
greet_user('sarah') 

在这里插入图片描述
这是一个简单的例子,关键字def告诉python要定义一个函数,greet_user()是函数名,括号中的username是调用函数时需要指定的信息,定义以冒号结尾。紧跟在定义后面的所有缩进行构成了函数体。要调用函数,只需要依次指定函数名及括号括起的必要信息。
实参和形参:在函数greet_user()的定义中,username是一个形参,就是一个形式上的参数,此时这个参数不包含任何信息;在代码greet_user(‘sarah’)中,’sarah’是一个实参,也就是是一个实际存在的参数。

2.传递实参

1)位置实参
调用函数时,python必须将函数调用中每个实参都关联到函数定义的一个形参。最简单的关联方式是基于实参的顺序。这种关联方式被称为位置实参。

def describe_pet(animal_type, pet_name):
    print("\n我有一只" + animal_type + "。")
    print("我的" + animal_type + "的名字叫" + pet_name.title() + "。")

describe_pet('仓鼠', 'harry')
describe_pet('狗', 'willie')

在这里插入图片描述
在函数调用中,‘仓鼠’存储在形参animal_type中,‘harry’存储在形参pet_name中。被定义好的函数可以多次调用。
位置实参就是依照形参定义的顺序来对应实参,如果函数调用时实参顺序不正确,就会导致输出结果有误甚至程序报错。

describe_pet('harry', '仓鼠')

在这里插入图片描述
2)关键字实参

describe_pet(animal_type='仓鼠', pet_name='harry')
describe_pet(pet_name='harry', animal_type='仓鼠')

在这里插入图片描述
前面我们说到,在位置实参中,函数调用时,实参的顺序至关重要。但是在关键字实参中,顺序却变得无所谓了,这是因为在函数调用中,已经为实参指定了相对应的形参了,就不会出现混淆的问题。
3)默认值
编写函数时,可给每个形参指定默认值:如果不给形参传递实参,就使用默认值;如果显式提供实参,python将使用指定的实参值而忽略默认值。指定默认值的形参一般放在参数列表的最后。

def describe_pet(pet_name,animal_type='dog'):
    print("\n我有一只" + animal_type + "。")
    print("我的" + animal_type + "的名字叫" + pet_name.title() + "。")

describe_pet(pet_name='willie')
describe_pet('willie')
describe_pet(pet_name='harry', animal_type='仓鼠')

在这里插入图片描述

3.返回值

1)返回简单值

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)

在这里插入图片描述
调用返回值的函数时,需要使用一个变量,用于存储返回的值。这里将返回值存储在musician中。
2)让实参变成可选的
举一个案例,扩展get_formatted_name()函数,使其同时处理名、姓、中间名,但是不是所有人都有中间名。为了让中间名变成可选的,可以给middle_name指定一个默认值——空字符串,并将其放在形参列表的末尾。

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('jimi', 'hendrix','lee')
print(musician)

在这里插入图片描述
3)返回字典

def build_person(first_name, last_name):
    person = {'first': first_name, 'last': last_name}
    return person

musician = build_person('jimi', 'hendrix')
print(musician)

在这里插入图片描述
函数可以返回任意类型的值,包括列表和字典等比较复杂的数据结构。

4.传递列表

def greet_users(names):
    for name in names:
        msg = "你好," + name.title() +"!"
        print(msg)

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

在这里插入图片描述
1)在函数中修改列表

def print_models(unprinted_designs, completed_models):
    while unprinted_designs:
        current_design = unprinted_designs.pop()
        print("打印模型:" + current_design)
        completed_models.append(current_design)
        

def show_completed_models(completed):
    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)
show_completed_models(completed_models)

在这里插入图片描述
以上函数对列表进行了操作,修改了列表中的内容。有时候,我们不想修改列表,这个时候应该怎么办呢?

print_models(unprinted_designs[:], completed_models)

修改这条语句就可以实现。通过切片将列表的副本传递给函数,而不是列表本身。

5.传递任意数量的实参

1)使用任意数量实参
有时候,预先不知道函数需要接受多少个实参,python中允许函数调用语句中收集任意数量的实参

def make_pizza(*toppings):
    print(toppings)

make_pizza('青椒')
make_pizza('蘑菇', '青椒', '奶酪')

在这里插入图片描述
形参名*toppings中的星号让python创建一个名为toppings的空元组,并将收到的所有值都封装到这个元组中。

def make_pizza(*toppings):
    for topping in toppings:
        print("-" + topping)

make_pizza('蘑菇', '青椒', '奶酪')

在这里插入图片描述
果要让函数接受不同类型的实参,必须在函数定义中将接纳任意数量实参的形参放在最后。Python先匹配位置实参和关键字实参,再将余下的实参都收紧到最后一个形参中。
2)使用任意数量的关键字实参
有时候,需要接受任意数量的实参,但是不知道传递给函数的会是什么样的信息。这种情况下,可以将函数编写成能够接受任意数量的键-值对。

def build_profile(first, last, **user_info):
    profile = {}
    profile['first_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)

在这里插入图片描述
形参**user_info中的两个星号让python创建一个名为user_info的空字典,并将接受到的所有名称-值对都封装到这个字典中。

6.将函数存储在模块中

import pizza
from pizza import make_pizza
from pizza import make_pizza as mp
import pizza as p
from pizza import *

7.函数编写指南

给函数命名时,应指定描述性名称,且在其中只使用小写字母和下划线。
给形参指定默认值时,等号两边不要有空格。
使用两个空行将相邻的函数分开。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值