Python学习笔记6—函数

一、定义函数

def greet_user(username):
    """显示简单的问候语"""
    print("Hello, " + username.title() + "!")

greet_user('tom')

注:三引号引起来的文本被称为文档字符串的注释,描述了函数是做什么的,Python使用它们来生成有关的程序中函数的文档。

二、传递实参

1、位置实参

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

def describe_pet(animal_type,pet_name):
    """显示宠物的信息"""
    print("\nI have a " + animal_type + ".")
    print("My " + animal_type + "'s name is " + pet_name.title() + "."

deccribe_pet('dog','harry')

2、关键字实参

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

def describe_pet(animal_type,pet_name):
    """显示宠物的信息"""
    print("\nI have a " + animal_type + ".")
    print("My " + animal_type + "'s name is " + pet_name.title() + "."

deccribe_pet(animal_type='dog',pet_name='harry')

注:关键字实参等号两边不要有空格。

3、默认值

编写函数时,可给每个形参指定默认值。在调用函数时给形参提供了实参的话,Python将使用指定的实参值,否则,将使用形参的默认值。

def describe_pet(pet_name,animal_type='dog'):
    """显示宠物的信息"""
    print("\nI have a " + animal_type + ".")
    print("My " + animal_type + "'s name is " + pet_name.title() + "."

deccribe_pet('harry')
deccribe_pet('haha','cat')

注:

  • 使用默认值时,在形参列表中必须先列出没有默认值的形参,再列出有默认值的形参。
  • 给形参指定默认值时,等号两边不要有空格。

总:三种方式可混合使用。

三、返回值

使用return语句将值返回到调用函数的代码行。返回值让你能够将程序的大部分繁重的工作移到函数中去完成,从而简化主程序。

def build_persion(first_name,last_name):
    """返回一个字典,其中包含有关一个人的信息"""
    persion = {'first':first_name,'last':last_name}
    return persion

musician = build_persion('jimi','hendrix')
print(msician)

四、传递列表

想函数传递列表是很有用的,这种列表包含的可能是名字、数字或更复杂的对象(如字典)。将列表传递给函数后,函数就能直接访问其内容了。

1、在函数中修改列表

在函数中对这个列表所做的任何修改都是永久性的,这让你能够高效地处理大量的数据。

unconfirmed_users = ['alice','brian','candace']
confirmed_users = []

while unconfirmed_users:
    current_user = unconfirmed_users.pop()
    print("Verifying user: " + current_user.title())
    confirmed_users.append(current_user)

print(\nThe confirmed_users are: ")
for user in confirmed_users:
    print(user)

为重新组织这些代码,可编写两个函数,每个都做一件具体的工作。大部分代码都与原来相同,只是效率更高了。

def confirmed_users(unconfirmed_users,confirmed_users):
    """将未验证的用户一一验证"""
    while unconfirmed_users:
        current_user = unconfirmed_users.pop()
        print("Verifying user: " + current_user.title())
        confirmed_users.append(current_user)

def show_confirmed_users(confirmed_users):
    """显示验证好的用户"""
    print(\nThe confirmed_users are: ")
    for user in confirmed_users:
        print(user)

unconfirmed_users = ['alice','brian','candace']
confirmed_users = []

confirmed_users(unconfirmed_users,confirmed_users)
show_confirmed_users(confirmed_users)

2、禁止函数修改列表

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

function_name(list_name[:])

注:切片表示法[ : ] 创建列表的副本。

虽然向函数传递列表的副本可保留原始列表的内容,但除非有充分的理由需要传递副本,否则还是应该将原始列表传递给函数,因为让函数使用现成列表可避免花时间和内容创建副本,从而提高效率,在处理大型列表时尤其如此。

五、传递任意数量的实参

有时候,你预先不知道函数需要接受多少个实参,好在Python允许函数从调用语句中收集任意数量的实参。

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

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

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,'peppers')
make_pizza(10,'peppers','cheese')

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

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

def bulid_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 = 'physice')
print(user_profile)

注:形参**user_info中的两个星号让Python创建一个名为user_info的空字典,并将收集到的所有名称—值对都封装到这个字典中。

六、将函数存储在模块中

函数的优点之一是,使用它们可将代码块和主程序分离。通过给函数指定描述性名称,可让主程序容易理解得多。还可更进一步,将函数存储在被称为模块的独立文件中,再将模块导入到主程序中,import语句运行在当前运行的程序文件中使用模块中的代码。
通过将函数存储在独立文件中,可隐藏代码的细节,将重点放在程序的高层逻辑上,这还能让你在众多不同的程序中重用函数。

1、导入整个模块

import module_name

module_name.function_name()

2、导入特定的函数

from module_name import function_name

function_name()
from module_name import function_0,function_1,function_2

function_0()
function_1()
function_2()

3、使用as给函数指定别名

from module_name import function_name as fn

fn()

4、使用as给模块指定别名

import module_name as mn

mn.function_name()

5、导入模块中的所有函数

from module_name import *

function_name()

注:由于导入了每个函数,可通过名称来调用每个函数,而无需使用句点表示法。

但是,使用并非自己编写的大型模块时,最好不要采用这种导入发方法,如果模块中有函数的名称与你的项目中国使用的名称相同,可能导致意想不到的后果。Python可能遇到多个名称相同的函数或变量,进而覆盖函数。而不是分别导入所有的函数。

最佳做法:

  • 只导入所需要的函数
  • 导入整个模块并使用句点表示法

编写建议:

  • 如果程序或模块包含多个函数,可使用两个空行将相邻的函数分开,这样更容易知道前一个函数在什么地方结束,下一个函数此从什么地方开始。
  • 所有的import语句都应放在文件开头,唯一例外的情形是,在文件开头使用了注释来描述整个程序。
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,254评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,875评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,682评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,896评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,015评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,152评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,208评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,962评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,388评论 1 304
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,700评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,867评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,551评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,186评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,901评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,142评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,689评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,757评论 2 351

推荐阅读更多精彩内容

  • 2017年12月5日 8.1 定义函数 8.1.1 简单的函数实例: 8.1.2 实参与形参: 形参(parame...
    azpo2009_198e阅读 208评论 0 0
  • 要点: 函数式编程:注意不是“函数编程”,多了一个“式” 模块:如何使用模块 面向对象编程:面向对象的概念、属性、...
    victorsungo阅读 1,485评论 0 6
  • 函数可以将程序拆分成独立的几部分,使程序趋于简单化。 1.1、定义和调用函数 使用关键字def 来告诉python...
    焰火青春阅读 620评论 0 1
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,644评论 18 139
  • 制定计划时 ,将任务设定为一个较高值,但同时不把时间排满,给自己留出一两个小时作为缓冲。 设计任务需要遵循的原则:...
    加加_2a9b阅读 201评论 0 0