05 -Python入门- Lesson5 函数

05 Python入门 Lesson5 函数

5.变量作用域

如果遇到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)

8.文档

docstrings和代码没有任何关系,但是却非常的有用,这里我直接盗版小艾助教大大的论述:

python中的docstring有特别精辟的解释,盗版如下:

  1. python有一个很牛逼的功能叫做自省
  2. 有很多的自省函数,比如help,dir,type,id等等
  3. 就是为了在程序运行期间获取对象的信息
  4. 比如这个docstring,可以通过help来查看。你的代码是干什么用的,怎么用的,别人就很清楚了
  5. 记住一点,代码是写给机器运行的,但是是写给人看的。可维护性,可读性非常重要。否则同事会画圈圈诅咒你的哦
  6. 你想象一下,你在写代码的时候老是有人打断你,问你你写的这个函数怎么用,如果你写了docstring,就不会有这样的遭遇了。也不会有想要把同事掐死的冲动。
  7. 为了团结友爱世界和平,请为你的函数和类添加docstring
  8. 你可能有一点困惑就是,我已经写了注释,还要不要写docstring
  9. 不困惑了,为了防止同事找我 ,我决定把docstring 写得叼一点
  10. 而且有很多工具可以自动根据docstring生成文档,省时省力
  11. 注释不能通过help查看哦,别人要有你的源文件,还得搜到你的函数才能看到注释

docstrings的显示有两种方法,注意这两种方式都不用知道函数要求的参数是什么:

help(functions)
# help的方式在vscode会在terminal停住,建议用下面的方法
print(functions.__doc__)

11.Lambda表达式

当一个简单函数只会使用一次的时候,可以使用匿名函数的方式进行表达。比如下面这个例子,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类似,如果感兴趣可以看扩展内容

14.迭代器和生成器(选学)

这部分逻辑有一点点复杂,时间允许的话可以多看几遍,也可以参考:这个链接

Plus.函数和方法的区别(超级选学)

  • 函数调用直接是:fuc1(arg1,arg2…)
  • 方法的调用时:data.methord1().methord2()…
  • 方法能做到的事情和函数类似,重大区别是可以串接(上面例子的形式)
  • 其实方法还分为bound和unbound两种,上面的方法例子是unbound的,系统会自动把.methord()之前的东西放到()内处理。想要细究的话请:附加1,附加2
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值