一、函数出错的时候抛异常,而不要返回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. hisql 与sqlsugar,freesql 数据插入性能测试

    hisql与目前比较流行的ORM框架性能测试对比 hisql 一直定位为新一代的ORM框架 为低代码开发而生 测试数据数据库为sqlserver数据库 测试源码地址hisql与sqlsugar fre ...

  2. 解决VirtualBox 运行时报内存不能written

    在VirtualBox 虚拟机中安装系统的时候,突然报"0x00000000指令,该内存不能written",只能强制停止,这个问题要怎么解决呢? 解决办法是恢复系统主题3个dll ...

  3. linux(CentOS7) 之 zookeeper 下载及安装

    下载 搜索apache ,进入apache官网(https://www.apache.org/)下载 选择downloads 下的distribution 点击archive site 找到zooke ...

  4. JMeter_使用正则和JSON提取器参数化(常用于提取token)

    一.使用正则表达式提取器提取token 查看登录响应参数找出token.图中token为 "ticketString": "ccf26b17-a96f-4913-8925 ...

  5. Django_模型类详解(七)

    # 定义书籍模型类 class BookInfo(models.Model): btitle = models.CharField(max_length=20) # 书籍名称 bpub_date = ...

  6. spring security +MySQL + BCryptPasswordEncoder 单向加密验证 + 权限拦截 --- 心得

    1.前言 前面学习了 security的登录与登出 , 但是用户信息 是 application 配置 或内存直接注入进去的 ,不具有实用性,实际上的使用还需要权限管理,有些 访问接口需要某些权限才可 ...

  7. spring boot 启动读取的配置文件优先级

    1.优先级从高到低 1.  file:/config/ 2. file:/ 3. classpath:/config/ 4. classpath:/ 所有位置的application.properti ...

  8. antd中的form表单 initialValue导致数据不更新问题

    初步理解 : initialValue就是所谓的defaultValue,只会在第一次赋值的时候改变,却又有一些不同,因为 initialValue又会因其他改动而改变. 然而当获取的数据重新上来要渲 ...

  9. 第10组 Alpha冲刺 (4/6)(组长)

    1.1基本情况 ·队名:今晚不睡觉 ·组长博客:https://www.cnblogs.com/cpandbb/p/13982696.html ·作业博客:https://edu.cnblogs.co ...

  10. Go语言系列- http编程和mysql

    http编程 一.Http协议  1. 什么是协议? 协议,是指通信的双方,在通信流程或内容格式上,共同遵守的标准.  2. 什么是http协议? http协议,是互联网中最常见的网络通信标准.  3 ...