Python语法中的模糊语义

目录
  • 1. 切片不执行越界检查和报错
  • 2. 空列表的创建
  • 3.闭包的延迟绑定

1. 切片不执行越界检查和报错

下面代码的输出结果将是什么?

list = ['a', 'b', 'c', 'd', 'e']
print list[10:]

下面的代码将输出空列表 [] ,不会产生IndexError错误。就像所期望的那样,尝试用超出成员的个数的index来获取某个列表的成员。

例如,尝试获取 list[10] 和之后的成员,会导致 IndexError .

然而,尝试获取列表的切片,开始的index超过了成员个数不会产生IndexError,而是仅仅返回一个空列表。

这成为特别让人恶心的疑难杂症,因为运行的时候没有错误产生,导致bug很难被追踪到。

2. 空列表的创建

1ist = [[ ]] * 5
list  # output?
list[0].append(10)
list  # output?
list[1].append(20)
list  # output?
list.append (30)
list  # output?

2,4,6,8行将输出什么结果?试解释。

输出的结果如下:

[[],[],[],[],[]]
[[10],[10],[10],[10],[10]]
[[10,20],[10,20],[10,20]]
[[10,20],[10,20],[10,20],[10,20],[10,20],30]

第一行的输出结果直觉上很容易理解,例如 list = [ [ ] ] * 5 就是简单的创造了5个空列表。然而,理解表达式 list=[ [ ] ] * 5 的关键一点是它不是创造一个包含五个独立列表的列表,而是它是一个创建了包含对同一个列表五次引用的列表。只有了解了这一点,我们才能更好的理解接下来的输出结果。

3.闭包的延迟绑定

下面这段代码的输出结果将是什么?请解释。

'''
学习中遇到问题没人解答?小编创建了一个Python学习交流群:531509025
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
def multipliers():
    return [lambda x : i*x for i in range(4)]

print [m(2) for m in multipliers()]

你如何修改上面的multipliers的定义产生想要的结果?
上面代码输出的结果是 [6, 6, 6, 6] ,而不是我们想的 [0, 2, 4, 6]

上述问题产生的原因是Python闭包的延迟绑定。这意味着内部函数被调用时,参数的值在闭包内进行查找。因此,当任何由multipliers()返回的函数被调用时,i的值将在附近的范围进行查找。那时,不管返回的函数是否被调用,for循环已经完成,i被赋予了最终的值3。

因此,每次返回的函数乘以传递过来的值3,因为上段代码传过来的值是2,它们最终返回的都是6(3*2)。碰巧的是,《The Hitchhiker's Guide to Python》也指出,在与lambdas函数相关也有一个被广泛被误解的知识点,不过跟这个case不一样。由lambda表达式创造的函数没有什么特殊的地方,它其实是和def创造的函数式一样的。

下面是解决这一问题的一些方法。

一种解决方法就是用Python生成器。

def multipliers():
    for i in range(4): yield lambda x : i * x

另外一个解决方案就是创造一个闭包,利用默认函数立即绑定。

def multipliers():
    return [lambda x, i=i : i * x for i in range(4)]

还有种替代的方案是,使用偏函数:

from functools import partial
from operator import mul

def multipliers():
    return [partial(mul, i) for i in range(4)]

到此这篇关于Python语法中的模糊语义的文章就介绍到这了,更多相关Python语法中内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Python3.8官网文档之类的基础语法阅读

    目录 1.类定义 2.类对象 3.实例对象 4.方法对象 5.类和实例变量 6.补充说明 官网类的基础语法阅读 英文官方文档: https://docs.python.org/3.8/tutorial/classes.html 中文官方文档: https://docs.python.org/zh-cn/3.8/tutorial/classes.html 类提供了一种组合数据和功能的方法. 创建一个新类意味着创建一个新的对象类型,从而允许创建一个该类型的新实例. 1.类定义 最简单的类定义看起来像

  • python语法之语言元素和分支循环结构详解

    目录 一.语言元素 1.变量及其类型 (1)变量 (2)变量类型 2.变量命名规则 3.变量的使用 4.运算符 二.分支循环结构 1.if 2.for-in 3.while 总结 python中严格控制缩进,一个tab键或者4个空格 一.语言元素 1.变量及其类型 (1)变量 所谓变量,就是可以改变的量. 首次使用变量会在内存中划分空间,并初始化值: 再次使用变量不再划分空间,修改原空间的. (2)变量类型 ①数值类型 int float bool:True.False ②字符串类型 字符串运算

  • 小学生也能看懂的python语法之循环语句精解

    目录 while循环 while实现猜拳游戏 计算1-100之间的累加和 计算1-100之间偶数的累加和 计算1-100之间偶数的累加和2 while循环嵌套 for循环 for 循环嵌套 循环嵌套使用-打印正方形 打印三角形 break continue 循环和else

  • Python3 基础语法详解

    目录 编码 标识符 python保留字 注释 行与缩进 多行语句 数字(Number)类型 字符串(String) 空行 等待用户输入 同一行显示多条语句 多个语句构成代码组 print 输出 import 与 from...import 命令行参数 Python3 基础语法 编码 默认情况下,Python 3 源码文件以 UTF-8 编码,所有字符串都是 unicode 字符串.当然你也可以为源码文件指定不同的编码: # -*- coding: cp-1252 -*- 上述定义允许在源文件中使

  • python标准库之time模块的语法与简单使用

    目录 表示时间的方式 1. 调用语法: 2. time概述 3. 时间获取 4. 时间格式化(将时间以合理的方式展示出来) 5. 程序计时应用 6. 示例 总结 表示时间的方式 时间戳表示法: 即以整型或浮点型表示的是一个以秒为单位的时间间隔.这个时间的基础值是从1970年的1月1号零点开始算起. 格式化的时间字符串: 即以格式化字符串的格式输出时间形式. 元组格式表示法: 即一种Python的数据结构表示.这个元组有9个整型内容(不能少),分别表示不同的时间含义. 索引(Index) 属性(A

  • Python语法详解之decorator装饰器

    python 是一门优雅的语言,有些使用方法就像魔法一样.装饰器(decorator)就是一种化腐朽性为神奇的技巧.最近一直都在使用 Tornado 框架,一直还是念念不忘 Flask .Flask 是我最喜欢的 Python 框架,最早被它吸引也是源自它使用装饰器这个语法糖(Syntactic sugar)来做 Router,让代码看上去就感觉甜甜的. Tornado 中的 Router 略显平淡,怀念 Flask 的味道,于是很好奇的想知道 Flask 是如何使用这个魔法.通过阅读 Flas

  • Python基础语法之容器详解

    目录 Python基础语法-容器 1.列表(list) 1.1 列表基本概念 1.2 获取元素 1.3 增.删.改 1.3.1 增 - -增加元素 1.3.2 删 - 删除元素 1.3.3 改-改变列表中的元素 总结 Python基础语法-容器 容器型数据类型是指可以包含多个多种数据类型数据的数据类型. 1.列表(list) 1.1 列表基本概念 列表是Python自带的容器型数据类型,将"[]"作为容器的标志,里面多的元素用逗号隔开:[元素1, 元素2, 元素3,-] 特点: 1.元

  • Python语法中的模糊语义

    目录 1. 切片不执行越界检查和报错 2. 空列表的创建 3.闭包的延迟绑定 1. 切片不执行越界检查和报错 下面代码的输出结果将是什么? list = ['a', 'b', 'c', 'd', 'e'] print list[10:] 下面的代码将输出空列表 [] ,不会产生IndexError错误.就像所期望的那样,尝试用超出成员的个数的index来获取某个列表的成员. 例如,尝试获取 list[10] 和之后的成员,会导致 IndexError . 然而,尝试获取列表的切片,开始的inde

  • python语法 之与用户交互和运算符

    目录 一 程序与用户交互 1.1.什么是与用户交互 1.2.为什么要与用户交互? 1.3.如何与用户交互 1.3.1 输入input: 1.3.2 输出print: 1.3.3 输出之格式化输出 二 基本运算符 2.1 算术运算符 2.2 比较运算符 2.3 赋值运算符 2.4 逻辑运算符 2.4.1 连续多个and 2.4.2 连续多个or 2.4.3 混用and.or.not 2.5 成员运算符 2.6 身份运算符 一 程序与用户交互 1.1.什么是与用户交互 用户交互就是人往计算机中inp

  • Python语法之精妙的十个知识点(装B语法)

    Python 是一种代表简单思想的语言,其语法相对简单,很容易上手.不过,如果就此小视 Python 语法的精妙和深邃,那就大错特错了.本文精心筛选了最能展现 Python 语法之精妙的十个知识点,并附上详细的实例代码.如能在实战中融会贯通.灵活使用,必将使代码更为精炼.高效,同时也会极大提升代码B格,使之看上去更老练,读起来更优雅. 1. for - else 什么?不是 if 和 else 才是原配吗?No,你可能不知道,else 是个脚踩两只船的家伙,for 和 else 也是一对,而且是

  • python Django中models进行模糊查询的示例

    多个字段模糊查询, 括号中的下划线是双下划线,双下划线前是字段名,双下划线后可以是icontains或contains,区别是是否大小写敏感,竖线是或的意思 #搜索功能 @csrf_exempt#使用@csrf_exempt装饰器,免除csrf验证 def search_testCaseApi(request): if request.method == 'POST': name = request.POST.get('task_name') updateUser=request.POST.ge

  • 对于Python编程中一些重用与缩减的建议

    返璞归真 许多流行的玩具都以这样一个概念为基础:简单的积木.这些简单的积木可通过多种方式组合在一起构造出全新的作品 -- 有时甚至完全令人出乎意料.这一概念同样适用于现实生活中的建筑领域,将基本原材料组合在一起,形成有用的建筑物.平凡无奇的材料.技术和工具简化了新建筑物的建造过程,同样也简化了对新踏入此领域的人员的培训. 相同的基本概念也适用于计算机程序开发技术,包括以 Python 编程语言编写的程序.本文介绍了使用 Python 创建基本构件 (building block) 的方法,可用于

  • 详解Python自动化中这八大元素定位

    一.find_element_by_id() find_element_by_id() 1.从上面定位到的元素属性中,可以看到有个id属性:id="kw",这里可以通过它的id属性定位到这个元素. 2.定位到搜索框后,用send_keys()方法,就可以输入文本. from selenium import webdriver driver = webdriver.Firefox() driver.get("http://www.baidu.com") # 通过id定

  • Python语法概念基础详解

    目录 Python之禅: Python基础: 1. 进制转换: 2. 数据类型: 3. 单双引号转义字符的使用: 4.单双三引号的转义换行: 5.字符串的运算: 6.组的概念与含义: 7.集合: 8.系统关键字与引用的可变性和值的不可变性: 9.逻辑运算符: 10.分支,条件,循环,枚举,包,模块,函数: 11.面向对象基本知识: 12.运算符优先级问题: 13.代码自动调节工具pep8: 14.python库的安装: 15.解决pip超时问题: 总结 (本章节主要是一些python的基础语法,

  • Python语法快速入门指南

    Python语言与Perl,C和Java等语言有许多相似之处.但是,也存在一些差异. 在本章中我们将来学习Python的基础语法,让你快速学会Python编程. 第一个Python程序 交互式编程 交互式编程不需要创建脚本文件,是通过 Python 解释器的交互模式进来编写代码. linux上你只需要在命令行中输入 Python 命令即可启动交互式编程,提示窗口如下: $ python Python 2.7.6 (default, Sep 9 2014, 15:04:36) [GCC 4.2.1

  • Python编程中的反模式实例分析

    本文实例讲述了Python编程中的反模式.分享给大家供大家参考.具体分析如下: Python是时下最热门的编程语言之一了.简洁而富有表达力的语法,两三行代码往往就能解决十来行C代码才能解决的问题:丰富的标准库和第三方库,大大节约了开发时间,使它成为那些对性能没有严苛要求的开发任务的首选:强大而活跃的社区,齐全的文档,也使很多编程的初学者选择了它作为自己的第一门编程语言.甚至有国外的报道称,Python已经成为了美国顶尖大学里最受欢迎的编程入门教学语言. 要学好一门编程语言实属不易,在初学阶段,就

  • 深入解析Python编程中JSON模块的使用

    JSON编码支持的基本数据类型为 None , bool , int , float 和 str , 以及包含这些类型数据的lists,tuples和dictionaries. 对于dictionaries,keys需要是字符串类型(字典中任何非字符串类型的key在编码时会先转换为字符串). 为了遵循JSON规范,你应该只编码Python的lists和dictionaries. 而且,在web应用程序中,顶层对象被编码为一个字典是一个标准做法. JSON编码的格式对于Python语法而已几乎是完

随机推荐