【有书共读05】《Python编程》读书笔记07

函数的操作

传递列表

向函数传递列表有时候非常有用,这种列表有可能包含的是名字、数字或更复杂的对象(如字典),将列表传递给函数后,函数就能直接访问其内容
来看一个简单的例子

def greet_users(names):
    for name in names:
        msg = 'Hello, ' + name.title() + '!'
        print(msg)

usernames = ['Wana' , 'Xioali', 'Sandy']
greet_users(usernames)

在函数中修改列表

如果我们将列表的值传入函数中,并期望可以在函数中修改它的值,只需要将列表名称传入函数中即可。
就如同上一个例子(当然刚才的例子并没有列表的值进行更改,但是它是可以更改的!!!)
再来一个例子:

#coding:utf-8
def liking(names):
    names.append('Banana')
    names.append('Apple')
    names.append('Orange')

likes = []
#这时的列表likes是个空列表

liking(likes)
#通过函数对列表进行操作

print(likes)
#likes发生改变:['Banana', 'Apple', 'Orange']

禁止函数修改列表

但是有些时候,我们需要禁止函数修改列表,这时候只需要向函数中传递列表的副本即可
通过列表的切片表示法来创建副本
(同样是上面的例子,只是把实参稍微改动一下= ̄ω ̄=)

#coding:utf-8
def liking(names):
    names.append('Banana')
    names.append('Apple')
    names.append('Orange')

likes = []
#这时的列表likes是个空列表

liking(likes[:])
'''注意这里我们传入的是一个列表的副本'''

print(likes)
#likes没有发生改变:[]

传递列表的两种方式一定要分清,并且要看情况使用。

传递任意数量的实参

在很多时候,我们预先不知道函数需要接受多少个实参,幸好python支持从调用语句中收集任意数量的实参。
还是先看一个简单的例子

#coding:utf-8
def  make_pizza(*toppings):
    '''打印顾客点的所有配料'''
    print(toppings)
    pass
make_pizza('aaaaa')
make_pizza('bbbbb' , 'ccccc' , 'ddddd')

'''输出结果
('aaaaa',)
('bbbbb', 'ccccc', 'ddddd')
'''

我们来看一看这个小程序:
形参名*toppings中的星号让Python创建一个名为toppings的空元组,并且将收到的所有值都封装到这个元组中。
当然,像这样的的任意数量的参数最好是同种类的参数,否则是比较难以处理的。

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

如果要让函数接受不同类型的实参,必须在函数定义中将接纳任意数量实参的形参放在最后

#coding:utf-8
def  make_pizza(size , *toppings):
    '''概述索要制作的pizza'''
    print("\nMaking a " + str(size) + '-inch pizza with the following toppions:')
    for topping in toppings:
        print("~" + topping)
    pass
make_pizza(2,'aaaaa')
make_pizza(4,'bbbbb' , 'ccccc' , 'ddddd')

使用任意数量的关键字形参

有时候,需要接受任意数量的实参,但预想不知道传递给函数的回事什么样的信息。在这种情况下,可将函数编写成能够接受任意数量的键-值对————调用语句提供了多少就接受多少 。

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('alert', 'einstein' , lacation = 'princeton' , field = 'physics')
print(user_profile)

形参**user_info中的两个星号让python创建一个名为user_info的字典,并将接收到的所有形式为名称-值对都封装到这个字典中。我们可以像访问字典一样访问user_info中的键-值对。

#Python#
全部评论
支持
点赞 回复 分享
发布于 2018-06-09 01:17

相关推荐

01-28 16:12
中南大学 Java
几年前还没有chatgpt的时候,刷题真的是很痛苦。刷不出来只能看题解,题解有几个问题:第一个是每次看的写题解的人都不一样,很难有一个统一的思路;第二个也是最重要的是,题解只提供了作者自己的思路,但是没有办法告诉你你的思路哪里错了。其实很少有错误的思路,我只是需要被引导到正确的思路上面去。所以传统题解学习起来非常困难,每次做不出来难受,找题解更难受。但是现在chatgpt能做很多!它可以这样帮助你 -1. 可以直接按照你喜欢的语言生成各种解法的题解和分析复杂度。2. 把题和你写的代码都发给它,它可以告诉你 你的思路到底哪里有问题。有时候我发现我和题解非常接近,只是有一点点🤏想错了。只要改这一点点就是最优解。信心倍增。3. 如果遇到不懂的题解可以一行一行询问为什么要这样写,chatgpt不会嫌你烦。有时候我觉得自己的range写错了,其实那样写也没错,只是chat老师的题解有一点优化,这个它都会讲清楚。4. 它可以帮你找可以用同类型解法来做的题。然后它可以保持解法思路不变,用一个思路爽刷一个类型的题。如果题目之间思路又有变化,它会告诉你只有哪里变了,其他的地方还是老思路。5. 它也可以直接帮你总结模板,易错点。经过chat老师的指导,我最大的改变是敢刷题了。之前刷题需要先找某一个人写的算法题repo,然后跟着某一个人他的思路刷他给的几个题。如果想写别的题,套用思路失败了,没有他的题解,也不知道到底哪里错了;看别人的题解,思路又乱了。这个问题在二分查找和dp类型的题里面特别常见。但是现在有chat老师,他会针对我的代码告诉我我哪里想错了,应该怎么做;还按照我写代码的习惯帮我总结了一套属于我的刷题模板。每天写题全是正反馈!
明天不下雨了:那我建议可以用 chatgpt atlas 或者 dia 去刷,也可以用 chrome 加个 ai 插件去刷 左边刷题右边 chat 效果很好
AI时代的工作 VS 传...
点赞 评论 收藏
分享
02-07 10:52
复旦大学 Java
混子不想混:非常能理解,感觉他们就靠着入行早,打压新人一样。我这个公司也是,天天干的累死累活,然后绩效打C,合着让新人被绩效,像是年底攒棺材本一样。总是打击之后,还会让人开始自我怀疑,是不是我努力的还不够,实际上并不是,就是他们不做人,故意打压新人。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务