《Effective Python》笔记——第2章 函数
一、函数出错的时候抛异常,而不要返回None
pass
二、闭包
书里的例子不好,参考https://www.cnblogs.com/Lin-Yi/p/7305364.html
在一个外函数中定义了一个内函数,内函数里运用了外函数的临时变量,并且外函数的返回值是内函数的引用。这样就构成了一个闭包。
# outer是外部函数 a和b都是外函数的临时变量
def outer(a):
b = 10
def inner():
#在内函数中 用到了外函数的临时变量
print(a+b)
# 外函数的返回值是内函数的引用
return inner demo = outer(5) # outer()返回的是inner函数,用的是outer的变量a=5,b=10
demo() # 相当于print(5+10)
在内函数中想修改闭包变量(外函数绑定给内函数的局部变量)的时候:
python3中可以用nonlocal 关键字声明 一个变量, 表示需要向上一层作用域中找这个变量。
def outer(a):
b = 10
def inner():
nonlocal a
a = a + 1
print(a+b)
return inner demo = outer(5)
demo() # 相当于print(5+1+10)
三、用生成器来改写直接返回列表的函数
def index_words(text):
# 返回字符串中单词首字母的index,并写入列表
result = []
if text:
result.append(0)
for index, letter in enumerate(text):
if letter == ' ':
result.append(index + 1)
return result def index_words_yie(text):
# 用生成器改写,数据量大时可以逐个处理
if text:
yield 0
for index, letter in enumerate(text):
if letter == ' ':
yield index + 1 textdemo = 'abc bcd adg'
res1 = index_words(textdemo)
print(res1)
res2 = index_words_yie(textdemo)
print(list(res2))
四、用None和文档字符串来描述具有动态默认值的参数
如果参数是可变的,一定要用None作为形式上的默认值,不然多次执行函数时会产生异常。
from datetime import datetime
from time import sleep def log1(message, when=datetime.now()):
print('%s: %s' % (when, message))
log1('haha')
sleep(1)
log1('gaga') # 结果如下,时间没变,因为datetime.now()只在函数被定义的时候执行了一次
2019-06-09 22:23:19.039818: haha
2019-06-09 22:23:19.039818: gaga def log2(message, when=None):
when = datetime.now() if when is None else when
print('%s: %s' % (when, message))
log2('haha')
sleep(1)
log2('gaga') # 结果如下,函数定义时为None,函数执行时则会重新设置默认值。
2019-06-09 22:23:20.040858: haha
2019-06-09 22:23:21.041467: gaga
import json def decode(data,default={}):
try:
return json.loads(data)
except ValueError:
return default # 执行两次函数,都返回空字典
foo = decode('bad data')
bar = decode('also bad')
# 为各自的空字典插入键值
foo['foo'] = 1
bar['bar'] = 2
print(foo)
print(bar) # 结果如下,两次执行函数,其实返回的是函数定义时生成的同一个字典,而不是各自独立生成一个新字典。
{'foo': 1, 'bar': 2}
{'foo': 1, 'bar': 2} # 把默认值改成None
def decode(data,default=None):
if default is None:
default = {}
try:
return json.loads(data)
except ValueError:
return default foo = decode('bad data')
bar = decode('also bad')
foo['foo'] = 1
bar['bar'] = 2
print(foo)
print(bar) # 结果如下,两次执行函数,都各自生成了新的字典
{'foo': 1}
{'bar': 2}
《Effective Python》笔记——第2章 函数的更多相关文章
- Python笔记·第十一章—— 函数 (二) 装饰器
一 为何要用装饰器 有的时候写完一段代码,过段时间需要对它进行升级.添加一些新功能,但是如果要直接修改原来的代码会影响其他人的调用,所以就需要一个不修改源代码且不修改原函数的调用方式的东西又能为原函数 ...
- 【python笔记】Qt+云函数 实现简单的登录框制作
[python笔记]Qt+云函数 实现简单的登录框制作 备注:前置条件:QtDesigner.pycharm.PyQt5.配置好的云函数(百度的叫函数计算CFC,用来充当一个简陋的服务器,主要是免费) ...
- [Effective JavaScript 笔记]第3章:使用函数--个人总结
前言 这一章把平时会用到,但不会深究的知识点,分开细化地讲解了.里面很多内容在高3等基础内容里,也有很多讲到.但由于本身书籍的篇幅较大,很容易忽视对应的小知识点.这章里的许多小提示都很有帮助,特别是在 ...
- A Byte of Python 笔记(5)函数:定义、形参、局部变量、默认参数、关键参数
第7章 函数 函数是重要的程序段.它们允许你给一块语句一个名称,然后你可以在程序的任何地方使用这个名称任意多次地运行这个语句块.这被称为 调用 函数. 定义函数 函数通过 def 关键字定义.def ...
- C++ primer plus读书笔记——第8章 函数探幽
第8章 函数探幽 1. 对于内联函数,编译器将使用相应的函数代码替换函数调用,程序无需跳到一个位置执行代码,再调回来.因此,内联函数的运行速度比常规函数稍快,但代价是需要占用更多内存. 2. 要使用内 ...
- C++ primer plus读书笔记——第7章 函数——C++的编程模块
第7章 函数--C++的编程模块 1. 函数的返回类型不能是数组,但可以是其他任何一种类型,甚至可以是结构和对象.有趣的是,C++函数不能直接返回数组,但可以将数组作为结构或对象的组成部分来返回. 2 ...
- [Python笔记][第四章Python正则表达式]
2016/1/28学习内容 第四章 Python字符串与正则表达式之正则表达式 正则表达式是字符串处理的有力工具和技术,正则表达式使用预定义的特定模式去匹配一类具有共同特征的字符串,主要用于字符串处理 ...
- 像计算机科学家一样思考python-第3章 函数
在程序设计中,函数是指用于进行某种计算的一系列语句的有名称的组合.定义一个函数时,需要指定函数的名称并写下一系列程序语句.之后,就可以使用名称来“调用”这个函数 3.1函数调用 一个函数调用的例子 & ...
- Python笔记(2)函数
python中一切皆对象,函数也看做对象.函数被函数名所引用,但是同样的他也可以被其他标识符所引用,可以作为参数传递. def f(): return "hi" 可见a引用了函数返 ...
随机推荐
- python appium使用uiselector定位时,提示 Could not parse UiSelector argument: 'XXX' is not a string
运行自动化代码,appium返回Could not parse UiSelector argument: 'XXX' is not a string,其中的xxx就是定位的元素 解决方案:外侧用 '' ...
- python_三元运算
条件三元运算 # 三元条件运算,如果条件为真则返回x,如果条件为假则返回y x = 3 y = 5 ret = x if x > y else y print(ret) # 返回 y值 for循 ...
- 华为云 Kubernetes 管理员实训 三 课后作业
Exercise 1 通过Deployment方式,使用redis镜像创建一个pod.通过kubectl获得redis启动日志. Deployment的名称为<hwcka-003-1-你的华为云 ...
- git branch --set-upstream-to 本地关联远程分支
最近使用git pull的时候多次碰见下面的情况: There is no tracking information for the current branch. Please specify wh ...
- Android官方文档翻译 一 Getting Started
Getting Started 让我们开始吧! Welcome to Training for Android developers. 欢迎来到Android开发者训练营. Here you'll f ...
- 安装MySQL到Ubuntu 20.04
本文的内容主要来自对How To Install MySQL on Ubuntu 20.04的翻译.在根据该文的指导下,我在自己的Ubuntu 20.04.3 LTS版本中安装了MySQL 8. St ...
- 白嫖党的福音!!!全新的Java300集视频(2022版)来了!
它来了它来了,经过一年时间的沉淀, [尚学堂]高淇Java300集完整版正式发布啦! 应广大网友和尚学堂忠实的孜孜学子以及听众朋友的要求,尚学堂在去年十月份就把预计在2022年发布的Java300集提 ...
- 【记录一个问题】opencl enqueueWriteBuffer()中,cl_bool blocking参数设置无效
err = queue.enqueueWriteBuffer(in_buf, true, 0, bmp_size, bmp_data, NULL, &event); 以上代码中,第二个参数设置 ...
- Spring 官宣发布 Spring Boot 3.0 第一个里程碑 M1,从 Java 8 提升到 Java 17!
Spring官方于2022年1月20日发布Spring Boot 3.0.0-M1版本,预示开启了Spring Boot 3.0的里程碑,相信这是通往下一代Spring框架的激动人心的旅程. 接下来一 ...
- 使用 C# 开发 Kubernetes 组件,获取集群资源信息
写什么呢 前段时间使用 C# 写了个项目,使用 Kubernetes API Server,获取信息以及监控 Kubernetes 资源,然后结合 Neting 做 API 网关. 体验地址 http ...