如果遇到UnboundLocalError说明函数中对函数外定义的变量进行了修改。Python不允许函数修改不在函数作用域内的变量(这种方式也可以让不同函数中可以有一样的变量名)。这个原则仅适用于整数和字符串,列表、字典、集合、类中可以在子程序中(子函数)通过修改局部变量达到修改全局变量的目的。
咱们看个错误的例子,下面这段代码会报错,因为函数buy_eggs试图修改函数外的变量:
egg_count = 0
def buy_eggs():
egg_count += 12 # purchase a dozen eggs
buy_eggs()
```®®®
正确的代码应该是这个样儿滴:
```python
def buy_eggs(count):
return count + 12 # purchase a dozen eggs
egg_count = 0
egg_count = buy_eggs(12)
docstrings和代码没有任何关系,但是却非常的有用,这里我直接盗版小艾助教大大的论述:
python中的docstring有特别精辟的解释,盗版如下:
- python有一个很牛逼的功能叫做自省
- 有很多的自省函数,比如help,dir,type,id等等
- 就是为了在程序运行期间获取对象的信息
- 比如这个docstring,可以通过help来查看。你的代码是干什么用的,怎么用的,别人就很清楚了
- 记住一点,代码是写给机器运行的,但是是写给人看的。可维护性,可读性非常重要。否则同事会画圈圈诅咒你的哦
- 你想象一下,你在写代码的时候老是有人打断你,问你你写的这个函数怎么用,如果你写了docstring,就不会有这样的遭遇了。也不会有想要把同事掐死的冲动。
- 为了团结友爱世界和平,请为你的函数和类添加docstring
- 你可能有一点困惑就是,我已经写了注释,还要不要写docstring
- 不困惑了,为了防止同事找我 ,我决定把docstring 写得叼一点
- 而且有很多工具可以自动根据docstring生成文档,省时省力
- 注释不能通过help查看哦,别人要有你的源文件,还得搜到你的函数才能看到注释
docstrings的显示有两种方法,注意这两种方式都不用知道函数要求的参数是什么:
help(functions)
# help的方式在vscode会在terminal停住,建议用下面的方法
print(functions.__doc__)
当一个简单函数只会使用一次的时候,可以使用匿名函数的方式进行表达。比如下面这个例子,double为赋值对象,涉及2个参数x,y(就是lambada 后面跟的),计算的时候吧两个参数乘积为结果(函数的内容就是冒号后面的东西)。
这里重点要讲下map()函数,map函数的作用就是根据函数,对指定的序列做计算。语法是这样的(注意先是要怎么处理数据的函数,后是要处理的数):
#map函数
map(function, iterable, ...)
当然这个function也是可以使用lambada一次完成的,两种方式对比如下:
#使用函数
def square(x) :
return x ** 2
map(square, [1,2,3,4,5])
#使用lambada
map(lambda x: x ** 2, [1, 2, 3, 4, 5])
#两种方式的结果是相同的:
[1, 4, 9, 16, 25]
#注意map是可以有多个输入的
map(lambda x, y: x + y, [1, 3, 5, 7, 9], [2, 4, 6, 8, 10])
#结果为
[3, 7, 11, 15, 19]
接下来我们就能看懂教室里的例子了:
numbers = [
[34, 63, 88, 71, 29],
[90, 78, 51, 27, 45],
[63, 37, 85, 46, 22],
[51, 22, 34, 11, 18]
]
#首先numbers是一个嵌套的列表,有4个元素,每个元素(每行)又包括4个元素
averages = list(map(lambda x :sum(x)/len(x),numbers))
#此处的list是将map生成的4行平均数存为一个列表
#lambada的内容是:sum(num_list)/len(num_list),用每个元素的加和除以每个元素内部的个数
#最后numbers是输入
filter函数和map类似,如果感兴趣可以看扩展内容
这部分逻辑有一点点复杂,时间允许的话可以多看几遍,也可以参考:这个链接