一、函数出错的时候抛异常,而不要返回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章 函数的更多相关文章

  1. Python笔记·第十一章—— 函数 (二) 装饰器

    一 为何要用装饰器 有的时候写完一段代码,过段时间需要对它进行升级.添加一些新功能,但是如果要直接修改原来的代码会影响其他人的调用,所以就需要一个不修改源代码且不修改原函数的调用方式的东西又能为原函数 ...

  2. 【python笔记】Qt+云函数 实现简单的登录框制作

    [python笔记]Qt+云函数 实现简单的登录框制作 备注:前置条件:QtDesigner.pycharm.PyQt5.配置好的云函数(百度的叫函数计算CFC,用来充当一个简陋的服务器,主要是免费) ...

  3. [Effective JavaScript 笔记]第3章:使用函数--个人总结

    前言 这一章把平时会用到,但不会深究的知识点,分开细化地讲解了.里面很多内容在高3等基础内容里,也有很多讲到.但由于本身书籍的篇幅较大,很容易忽视对应的小知识点.这章里的许多小提示都很有帮助,特别是在 ...

  4. A Byte of Python 笔记(5)函数:定义、形参、局部变量、默认参数、关键参数

    第7章  函数 函数是重要的程序段.它们允许你给一块语句一个名称,然后你可以在程序的任何地方使用这个名称任意多次地运行这个语句块.这被称为 调用 函数. 定义函数 函数通过 def 关键字定义.def ...

  5. C++ primer plus读书笔记——第8章 函数探幽

    第8章 函数探幽 1. 对于内联函数,编译器将使用相应的函数代码替换函数调用,程序无需跳到一个位置执行代码,再调回来.因此,内联函数的运行速度比常规函数稍快,但代价是需要占用更多内存. 2. 要使用内 ...

  6. C++ primer plus读书笔记——第7章 函数——C++的编程模块

    第7章 函数--C++的编程模块 1. 函数的返回类型不能是数组,但可以是其他任何一种类型,甚至可以是结构和对象.有趣的是,C++函数不能直接返回数组,但可以将数组作为结构或对象的组成部分来返回. 2 ...

  7. [Python笔记][第四章Python正则表达式]

    2016/1/28学习内容 第四章 Python字符串与正则表达式之正则表达式 正则表达式是字符串处理的有力工具和技术,正则表达式使用预定义的特定模式去匹配一类具有共同特征的字符串,主要用于字符串处理 ...

  8. 像计算机科学家一样思考python-第3章 函数

    在程序设计中,函数是指用于进行某种计算的一系列语句的有名称的组合.定义一个函数时,需要指定函数的名称并写下一系列程序语句.之后,就可以使用名称来“调用”这个函数 3.1函数调用 一个函数调用的例子 & ...

  9. Python笔记(2)函数

    python中一切皆对象,函数也看做对象.函数被函数名所引用,但是同样的他也可以被其他标识符所引用,可以作为参数传递. def f(): return "hi" 可见a引用了函数返 ...

随机推荐

  1. Kubernetes-Kuboard

    前言 本篇是Kubernetes第十五篇,大家一定要把环境搭建起来,看是解决不了问题的,必须实战. Kubernetes系列文章: Kubernetes介绍 Kubernetes环境搭建 Kubern ...

  2. mysql语句1-创建库和表

    一.DDL数据定义语言 就是对书库内部的对象进行创建.删除.修改等操作的语言. 关键字:create  drop  alter 1.连接数据库 mysql -u用户名 -p -h指定主机(不指定默认是 ...

  3. 微信小程序--数据共享与方法共享

    目录 全局数据共享 Mobox npm安装及其注意事项 小程序对 npm 的支持与限制 npm 依赖包的安装与使用 Mobox 1. 全局数据共享 2. 小程序中的全局数据共享方案 3. 使用mobx ...

  4. Pytest_简介与安装(1)

    一.Pytest简介 pytest是python的一种单元测试框架,与python自带的unittest测试框架类似,但更灵活.官方网站优点简介: 非常容易上手,入门简单,文档丰富,文档中有很多实例可 ...

  5. 实验 4 :Open vSwitch 实验 —— Mininet 中使用 OVS 命令

    实验 4 :Open vSwitch 实验 -- Mininet 中使用 OVS 命令 一.实验目的 Mininet 安装之后,会连带安装 Open vSwitch,可以直接通过 Python 脚本调 ...

  6. PPT制作手机手指滑动效果

    原文链接:https://www.toutiao.com/i6495304998786695694/ 上一节我们完成了手机滑动粗糙效果,这部分我们将给动画添加一个手指的图片. 首先,选择"插 ...

  7. Springboot整合Mybatis,连接多个数据库(Mysql+Oracle)

    maven依赖,需要注意的是mysql使用的版本 1 <dependencies> 2 <dependency> 3 <groupId>com.oracle.dat ...

  8. 《剑指offer》面试题54. 二叉搜索树的第k大节点

    问题描述 给定一棵二叉搜索树,请找出其中第k大的节点.   示例 1: 输入: root = [3,1,4,null,2], k = 1 3 / \ 1 4 \   2 输出: 4 示例 2: 输入: ...

  9. rocketmq实现延迟队列精确到秒级实现方案3-时间轮和秒级文件实现

    时间轮和秒级文件实现原理图 这种方案比较简单实现,通过秒级时间,建立对应的文件夹,只要相同的时间超时的消息,就在同一个目录,通过msgid保证文件不重复,等到了时间后,就扫描对应的文件夹的文件,发送到 ...

  10. 【记录一个问题】神坑,自定义一个golang的error类型,居然运行崩溃了

    2020-05-20 18:20补充: 感谢yif同学提供指导,出现错误并且打印大量信息的原因是函数递归调用导致栈溢出. 而导致递归调用的关键代码是%v 类型实现了error的interface %v ...