11 函数进阶

向函数传递列表

一个简单的示例 --- 向列表里的每一位问好!
def greet_users(names):
    """向列表里的每位朋友问好!"""
#下面是函数要做的事情
    for name in names:
        msg = "Hello, " + name.title() + "!"
        print(msg)
#先定义一个列表,还记的这里的usernames是叫实参        
usernames = ['zong hui', 'liu peipei', 'li guojian']
#最后我们来调用这个函数greet_users()
greet_users(usernames) 

Result

Hello, Zong Hui!
Hello, Liu Peipei!
Hello, Li Guojian!

--- 模拟3D打印的制作过程
def print_models(unprinted_designs, completed_models):
    """
    模拟打印每个设计,直到没有未打印的为止
    打印设计后,将其移至completeed_models列表   
    """ #这是对函数的说明,将产生一个函数说明问价
    while unprinted_designs:
        current_design = unprinted_designs.pop()#还记得pop()函数吗?它弹出列表元素
        
        #模拟根据设计制作3D打印的过程
        print("Printing model: " + current_design)
        completed_models.append(current_design)#还记得append()函数吗?它从列表末尾增加元素

def show_completed_models(completed_models):
    """显示打印好的所以模型"""
    print("\nThe following models have been printed:")
    for completed_model in completed_models:
        print(completed_model)
        
#下面假设未打印的模型列表
unprinted_designs = ['plane', 'car', 'bicycle']
#定义一个空列表,打印好的移至completed_models
completed_models = []

#下面调用第一个函数去处理
print_models(unprinted_designs, completed_models)
#再调用第二个函数去show
show_completed_models(completed_models)

######这个小程序也给了我们一些启示:
#一个函数只执行一项具体任务,例如此处模拟打印过程由一个函数完成,展示打印结果由另一个函数完成。   

Result

Printing model: bicycle
Printing model: car
Printing model: plane

The following models have been printed:
bicycle
car
plane

以上的程序,未打印列表不会被保存,但是有时候我们却需要它做备案
可以只向函数传递列表的副本 --- 还记得函数切片吗?
#只需要要将上面调用函数时传递的实参稍作更改即可
print_models(unprinted_designs[:], completed_models)
#unprinted_designs[:]
#只是将未打印列表的副本传递给了函数,也就是说原列表未改变
(但是不推荐给函数传递列表副本,因为这会增加时间和内存,除非你有充分的理由需要创建副本)
传递任意数量的实参
#你可以向函数传递任意多的实参 --- 点披萨的程序
def make_pizza(*toppings):
    """打印顾客所选择的配料"""
    print(toppings)

#下面地调用这个函数
make_pizza('pepperoni')
make_pizza('mushroom', 'green peppers', 'extra cheese')

#结果展示了不管输入几个实参,都被函数接收并打印
#用 function( *形参)的形式定义一个可以接收任意数量实参的形参

Result

('pepperoni',)
('mushroom', 'green peppers', 'extra cheese')

为了让以上结果好看些,可以遍历一下列表 --- 把新函数记作make_pizza2()
def make_pizza2(*toppings):
    """概述要制作的pizza"""
    print("\nMaking a pizza with the following toppings:")
    for topping in toppings:
        print("-" + topping)

#下面地调用这个函数
make_pizza2('pepperoni')
make_pizza2('mushroom', 'green peppers', 'extra cheese')

Result

Making a pizza with the following toppings:
-pepperoni

Making a pizza with the following toppings:
-mushroom
-green peppers
-extra cheese

结合使用 位置实参和任意数量实参
#点pizza时还需要制定pizza的尺寸 --- 我们假设顾客指定pizza的尺寸和配料
def make_pizza(size, *toppings):
    """概述要制作的pizza"""
    print("\nMaking a " + str(size) + " pizza with the following toppings:")
    for topping in toppings:
        print("-" + topping)
        
make_pizza(16, 'pepperoni')
make_pizza(12, 'mushroom', 'green peppers', 'extra cheese')
#函数的形参有两个,一个对应尺寸信息,一个是配料信息。注意要把任意形参放在最后

Result

Making a 16 pizza with the following toppings:
-pepperoni

Making a 12 pizza with the following toppings:
-mushroom
-green peppers
-extra cheese

使用任意数量的 关键字实参 --- 建立人物简介表的示例
def build_profile(first, last, **user_info):    #profile是人物简介的意思
    """创建一个字典,其中包含我们知道的有关用户的一切信息"""
    #首先建立一个空字典,用于存储用户信息
    profile = {} 
    profile['first_name'] = first
    profile['last_name'] = last
    
    for key, value in user_info.items():#还记得items()函数吗?它遍历字典的键-值对
        profile[key] = value            #将键-值对加入字典中
        
    #最后我们把字典profile返回给函数
    return profile 
#调用函数并输出结果
user_profile = build_profile('zong', 'hui',
                              location = 'shanghai',
                              field = 'sleep')
print(user_profile)

#函数有一个形参 **info 它接收传递来的 键-值对

Result

{'first_name': 'zong', 'last_name': 'hui', 'location': 'shanghai', 'field': 'sleep'}

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