0%

第十四节:推导表达式,迭代器,生成器,模块,包

自动摘要: title:第十四节:推导表达式,迭代器,生成器,模块,包 tags: 课后解答 url:246.html id:246 categories: 学习 教学 da ……..

title: 第十四节:推导表达式,迭代器,生成器,模块,包
tags:
- 课后解答
url: 246.html
id: 246
categories:
- 学习
- 教学
date: 2018-05-28 15:57:39

[danger]

一:推导表达式:

一、列表推导式和生成器表达式

1 #列表推导式
2 l = [i for i in range(10)] 3 print(l) 4 l1 = [‘选项%s’%i for i in range(10)] 5 print(l1)

1.把列表解析的[]换成()得到的就是生成器表达式 2.列表解析与生成器表达式都是一种便利的编程方式,只不过生成器表达式更节省内存 3.Python不但使用迭代器协议,让for循环变得更加通用。大部分内置函数,也是使用迭代器协议访问对象的。例如, sum函数是Python的内置函数,该函数使用迭代器协议访问对象,而生成器实现了迭代器协议,所以,我们可以直接这样计算一系列值的和:

1 sum(x ** 2 for x in range(4))

二、列表推导式

下面是一个以列表推导式为例的推导式详细格式,同样适用于其他推导式。

1 variable = [out_exp_res for out_exp in input_list if out_exp == 2] 2 out_exp_res:  列表生成元素表达式,可以是有返回值的函数。 3 for out_exp in input_list:  迭代input_list将out_exp传入out_exp_res表达式中。 4 if out_exp == 2:  根据条件过滤哪些值可以。 5
6 #变量(加工后的变量) for 变量 in 可迭代数据类型 条件判断

例一:30以内所有能被3整除的数

1 multiples = [i for i in range(30) if i % 3 is 0] 2 print(multiples) 3 # Output: [0, 3, 6, 9, 12, 15, 18, 21, 24, 27]

例二:30以内所有能被3整除的数的平方

1 def squared(x): 2 return x*x 3 multiples = [squared(i) for i in range(30) if i % 3 is 0] 4 print(multiples)

例三:找到嵌套列表中名字含有两个‘e’的所有名字

1 names = [[‘Tom’, ‘Billy’, ‘Jefferson’, ‘Andrew’, ‘Wesley’, ‘Steven’, ‘Joe’], 2 [‘Alice’, ‘Jill’, ‘Ana’, ‘Wendy’, ‘Jennifer’, ‘Sherry’, ‘Eva’]] 3
4 print([name for lst in names for name in lst if name.count(‘e’) >= 2]) # 注意遍历顺序,这是实现的关键

列表推导**+**条件判断: l2 = [iforiinrange(1, 11) ifi % 2 == 0]

列表推导**+**三目运算: l3 = [i if i % 2 == 0 else 0 for i in range(1, 11)]

三、字典推导式

例一:将一个字典的key和value对调

1 mcase = {‘a’: 10, ‘b’: 34} 2 #mcase的值 : key
3 mcase_frequency = {mcase[k]: k for k in mcase} 4 print(mcase_frequency)

例二:合并大小写对应的value值,将k统一成小写

1 mcase = {‘a’: 10, ‘b’: 34, ‘A’: 7, ‘Z’: 3} 2 #key.lower() : mcase.get(小写的当前key,0) + mcase.get(大写的当前key,0)
3 #如果没有找到的话,get返回0.和0相加还是原来数
4 mcase_frequency = {k.lower(): mcase.get(k.lower(), 0) + mcase.get(k.upper(), 0) for k in mcase.keys()} 5 print(mcase_frequency)

四、集合推导式

例:计算列表中每个值的平方,自带去重功能

     

二:迭代器和生成器:

迭代器

迭代是Python最强大的功能之一,是访问集合元素的一种方式。 迭代器是一个可以记住遍历的位置的对象。 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。 迭代器有两个基本的方法: _iter__方法:返回迭代器自身。可以通过python内建函数iter()调用。 __next__方法:当next方法被调用的时候,迭代器会返回它的下一个值,如果next方法被调用,但迭代器没有只可以返回,就会引发一个StopIteration异常。该方法可以通过 python 内建函数next()调用。  字符串,列表或元组对象都可用于创建迭代器:

生成器

简单的说,生成是包含yield关键字的函数。本质上来说,关键字yield是一个语法糖,内部实现支持了迭代器协议,同时yield内部是一个状态机,维护着挂起和继续的状态。 跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器。 在调用生成器运行的过程中,每次遇到 yield 时函数会暂停并保存当前所有的运行信息,返回 yield 的值, 并在下一次执行 next() 方法时从当前位置继续运行。 调用一个生成器函数,返回的是一个迭代器对象。

三,模块:

Python 模块(Module),是一个 Python 文件,以 .py 结尾,包含了 Python 对象定义和Python语句。 模块让你能够有逻辑地组织你的 Python 代码段。 把相关的代码分配到一个模块里能让你的代码更好用,更易懂。 模块能定义函数,类和变量,模块里也能包含可执行的代码。  

import 语句

模块的引入

模块定义好后,我们可以使用 import 语句来引入模块,语法如下:

from…import 语句

Python 的 from 语句让你从模块中导入一个指定的部分到当前命名空间中。语法如下:

from…import* 语句

把一个模块的所有内容全都导入到当前的命名空间也是可行的,只需使用如下声明:

搜索路径

当你导入一个模块,Python 解析器对模块位置的搜索顺序是:

  • 1、当前目录
  • 2、如果不在当前目录,Python 则搜索在 shell 变量 PYTHONPATH 下的每个目录。
  • 3、如果都找不到,Python会察看默认路径。UNIX下,默认路径一般为/usr/local/lib/python/。

模块搜索路径存储在 system 模块的 sys.path 变量中。变量里包含当前目录,PYTHONPATH和由安装过程决定的默认目录

四,包及包的管理

包概念: 把很多模块放到一个文件夹里面,就可以形成一个包 包管理: 当把很多模块放在文件中时,为了方便引用包中的模块,引入了包管理 在包管理中,加入此模块,则包名可以直接通过属性访问的方式,访问此模块内的对象,此模块不加上可能不会报错,但是规范是要加上,文件内容可以为空 相对路径导入: 在包管理中,可以通过 . (一个点) 和 .. (两个点)分别来导入同层和上一层的模块

引入作用: 在包中,如果包中模块要导入同一包中的其他模块,就必须使用此方法导入 使用方法: from .module(..module) import obj (as new_name) 引入之后的影响: 当一个模块中出现此导入方式,则该模块不能被直接运行,只能被导入  

我的理解是 from . import XXX默认的就是在当前程序所在文件夹里__init__.py程序中导入XXX,如果当前程序所在文件夹里没有__init__.py文件的话,就不能这样写,而应该写成from .A import XXX,A是指当前文件夹下你想导入的函数(或者其他的)的python程序名,如果你想导入的函数不在当前文件夹,那么就有可能用到 from .. import XXX(即上一个文件夹中的__init__.py),或者from ..A import XXX(即上一个文件夹中的文件A

https://www.zhihu.com/question/28688151/answer/66982373

[/danger]

欢迎关注我的其它发布渠道