【Python】08 函数

前言:函数是带名字的代码块,用于完成具体的工作。调用函数执行重复性的任务,程序的编写、阅读、测试和修复都将更容易。可将函数存储在模块中,让主程序文件更有序。

8.1 定义函数:关键字def

def greet_user():
    """显示简单的问候语""" #文档字符串docstring,是一种注释,描述了函数是做什么的。由三引号括起,用来生成有关程序中函数的文档
    print('hello!')
    
greet_user()#函数调用

8.1.1 向函数传递信息

def greet_user(username):
    """显示简单的问候语""" #文档字符串docstring,是一种注释,描述了函数是做什么的。由三引号括起,用来生成有关程序中函数的文档
    print('hello,'+ username.title() + '!') 
    
greet_user('claudia')#函数调用

8.1.2 实参和形参

8.1.1的例子中,username是一个形参,claudia是一个实参。
实参是调用函数时传递给函数的信息。

8.2 传递实参

  • 位置实参:要求实参的顺序和形参的顺序相同
  • 关键字实参:每个实参都由变量名和值组成
  • 还可以使用列表和字典

8.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")
describe_pet("cat","gary")

输出:
I have a hamster.
My hamster's name is Harry.

I have a cat.
My cat's name is Gary.

8.2.2 关键字实参

传递给函数的名称-值对。

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")
describe_pet(pet_name ="gary",animal_type ="cat")

输出于8.2.1相同结果

8.2.3 默认值

给形参指定默认值后,可在函数调用中省略相应的实参。

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 = "gary")

输出:
I have a dog.
My dog's name is Gary.

8.2.4 等效的函数调用

可混合使用位置实参、关键字实参和默认值,使用最容易理解的调用方式即可。

8.3 返回值

使用return语句将值返回到调用函数的代码行。调用返回值的函数时,必须提供一个变量,用于存储返回的值。

8.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)

8.3.2 让实参编程可选的

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("sarah","lee","Cooper")
print(musician)

8.3.3 返回字典

def build_person(first_name,last_name,age=""):
    """返回一个字典,包含有关一个人的信息"""
    person = {"first":first_name,"last":last_name}
    if age:
        person["age"] = age
    return person 

musician = build_person("jimi","hendrix",age = "27")
print(musician)

8.3.4 结合使用函数和while循环

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":
        break
        
    l_name = input("Last name: ")
    if l_name == "q":
        break
    
    formatted_name = get_formatted_name(f_name,l_name)
    print("\nHello, " + formatted_name + '!')

输出:


输出5.png

8.4 传递列表

将列表传递给函数后,函数可以直接访问列表内容,提高处理效率。

def greet_users(names):
   """向列表中的每位用户发出简单问候"""
   for name in names:
       msg = "hello, " + name.title() + '!'
       print(msg)

usernames = ['sarah','claudia','jack']
greet_users(usernames)

8.4.1 在函数中修改列表

在函数中对列表所做的任何修改都是永久性的。

#创建一个列表,包含一些要打印的设计
unprinted_designs = ['iphone case','robot pendant','dodecahedron']
completed_models = []

#模拟打印每个设计,直到全部打印
#打印每个设计后,将其移到completed——models中
while unprinted_designs:
    current_design = unprinted_designs.pop()
    
    #模拟根据设计制作3d打印模型的过程
    print('printing model:' + current_design)
    completed_models.append(current_design)

#显示打印好的所有模型
print("\nthe following models have been printed: ")
for completed_model in completed_models:
    print(completed_model)
def print_models(unprinted_models,completed_models):
    """
    模拟打印每个设计,直到全部打印
    打印后,移到completed_model中
    """
    while unprinted_designs:
        current_design = unprinted_designs.pop()
        
        #模拟打印模型过程
        print("printing model: " + current_design)
        completed_models.append(current_design)

def show_completed_models(completed_models):
    """显示打印好的模型"""
    print("\nthe following models have been printed:")
    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)

8.4.2 禁止函数修改列表

向函数传递列表的副本而不是原件。function_name(list_name[:])
除非特殊需求,否则还是传递原始列表,避免花时间和创建副本。

print_models(unprinted_designs[:],completed_models)

8.5 传递任意数量的实参

使用*形参创建空元组(值不可变的列表),将所有值都装到这个元组中

def make_pizza(*toppings):
    """概述要制作的pizza"""
    print("\nmaking a pizza with the follwoing toppings:")
    for topping in toppings:
        print("-" + topping)

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

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

要让函数接受不同类型的实参,必须在函数定义中将接纳任意数量实参的形参都放在最后,python先匹配位置实参和关键字实参,再将余下的实参都收集到一个形参中

def make_pizza(size,*toppings):
    """概述要制作的pizza"""
    print("\nmaking a " + str(size) + "-inch pizza with the follwoing toppings:")
    for topping in toppings:
        print("-" + topping)

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

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

def build_profile(first,last,**user_info): #形参的两个星号让python创建一个名为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)

8.6 将函数存储在模块中

函数可以将代码块与主程序分离。将函数存储在模块(独立文件,扩展名为.py)中,再将模块使用import语句导入主程序。

8.6.1 导入整个模块

module_nam.function_name()

import pizza

8.6.2. 导入特定的函数

导入特定函数无需再使用句点

  • 特定函数 from module_name import function_name
  • 任意数量函数 from module_name import function_0,function_1,function_2

8.6.3 使用as给函数指定别名

如函数名称与程序现有名称冲突,或者名称太长,可指定独一无二的别名
from module_name import function_name as fn

from pizza import make_pizza as mp
mp(16,"pepperoni")

8.6.4 使用as给模块指定别名

import module_name as mn

import pizza as p

8.6.5 导入模块中的所有函数

使用星号*可导入模块中的所有函数
from module_name import *

from pizza import *

Tips:最佳做法是要么只导入需要使用的函数,要么导入整个模块并用句点表示法,使代码更清晰,更易阅读和理解

8.7 函数编写指南

  • 应给函数指定描述性名称
  • 只在函数中使用小写字母和下划线
  • 应包含简要阐述其功能的注释,且需紧跟函数定义后面,并采用文档字符串格式
  • 给形参指定默认值时,等号两边不要有空格
  • 函数调用关键字实参时,等号两边不要有空格
  • 形参较多时,可在函数定义中输入左括号后按回车键,并在下一行按两次tab键,将形参列表和函数体区分开
  • 如果程序或模块包含多个函数,可用两个空行将相邻函数隔开
  • 所有import语句都应该放在文件开头(除非文件开头使用了注释来描述整个程序)
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,902评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,037评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,978评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,867评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,763评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,104评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,565评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,236评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,379评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,313评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,363评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,034评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,637评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,719评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,952评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,371评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,948评论 2 341

推荐阅读更多精彩内容

  • 1.定义一个函数 定义一个函数需要5个部分: def告诉Python,用户在自定义函数 function_name...
    陶不渊阅读 428评论 0 0
  • 课程大纲 函数定义 函数的参数 函数的返回值 高阶函数 函数作用域 递归函数 匿名函数 内置函数 函数式编程 将函...
    郭_扬阅读 782评论 0 4
  • 1.1.函数定义 1.1.1.定义一个函数 1.1python定义函数用def关键字,一般格式如下 1.2函数名的...
    Rolle_Wang阅读 477评论 0 0
  • 函数 位置实参 你调用函数时,Python必须将函数调用中的每个实参都关联到函数定义中的一个形参。因此最简单的关联...
    竹林徒儿阅读 454评论 2 2
  • 茫茫人海,历史千载,所有的问题都是人的问题,无论是治国理政,还是人间纷争,一个人从出生那天起,注定就开始了与问题相...
    感恩_心阅读 321评论 1 1