python各种推导式以及内置函数

今日主要内容:

1.迭代器和生成器补充,

2.生成器表达式和列表表达式.以及各种推导式

3.内置函数

1) 迭代器和生成器补充

1.查看一个对像是否是可迭代的,以及是否是迭代器.还可以通过导入这两个方法来实现

示例:

from collections import Iterable  #导入看是否可迭代的对像
from collections import Iterator  #导入查看是否是迭代器
s = "123"
f = isinstance(s,Iterable)
print(f)
f2 = isinstance(s,Iterator)
print(f2)


"""
运行结果是
True
False
"""

2.可迭代对像的特点是内部含有__iter__这个方法,迭代器特点是内部含有__iter__方法和__next__这个方法.

3.如下示例:注意生成器是如何生成的.

def fun():
    for i in range(10):
        yield  i
gen= fun()  # 这里的操作是生成一个生成器,注意,这里是并不执行的.只是一个生成器.

4.生成器有两种生成方法,一种是函数中带有yield,即通过生成器函数来生成.一种是通过生成器表达式来生成.

5.可迭代对像变成迭代器的方法有如下两种.

一种s.__iter__()这个就是生成了迭代器

一种是iter(对像)这个通过iter函数来实现

6迭代器的优点,主要有如下三个优点:

一.节省内存

二.惰性机制

三.单向不可逆

7.通过dir来查看一个可迭代对像是否是可迭代的,以及是否是生成器,

代码示例如下:

s ="123"
print("__iter__" in  dir(s))
print("__next__" in  dir(s))

 

2).生成器表达式和列表表达式.以及各种推导式

首先看一下列表表达式,示例如下:

lst = ["校服%s" % i for i in range(10)]
print(lst)

具体的格式如下:

 [变量(加工后的变量) for 变量 in iterable] 循环模式

列表推导式有两种模式,一种是上面说的循环模式,一种是条件模式.

 分类:
 [变量(加工后的变量) for 变量 in iterable] 循环模式
 [变量(加工后的变量) for 变量 in iterable if 条件] 筛选模式

下面是示例代码:

#10以内所有数的平方
lst = [i**2 for i in range(11)]
print(lst)
#30以内所有能被3整除的数的平方
lst1 = [i*i for i in range(1,31) if i % 3 == 0 ]
print(lst1)

#100 以内所有的奇数.
lst2 = [i for i in range(100) if i % 2 == 1]
print(lst2)

生成器就是把[]换成()列表表达式就变成了,生成器表达式.

如上面的代码换成生成器,并且表现出来,如下:

#10以内所有数的平方
gen = (i**2 for i in range(11))  #生成一个生成器
print(gen.__next__())
#30以内所有能被3整除的数的平方  #
gen1 = (i*i for i in range(1,31) if i % 3 == 0 )    #生成一个生成器
print(gen1.__next__())

#100 以内所有的奇数.
gen2 = (i for i in range(100) if i % 2 == 1)   #生成一个生成器
print(gen2.__next__())

#v如果想全部取出来的话,可以用for
for i in gen2:
    print(i)

为什么有生成器:
 生成器本身是自己用python代码构建的,这样就满足了个性化需求,满足以后你工作中需要.

下面有一个示例题:

 names = [['Tom', 'Billy', 'Jefferson', 'Andrew', 'Wesley', 'Steven', 'Joe'],['Alice', 'Jill', 'Ana', 'Wendy', 'Jennifer', 'Sherry', 'Eva']]

获取上面列表中的名字里面有两个e的,放在新的列表中.

示例代码:

names = [['Tom', 'Billy', 'Jefferson', 'Andrew', 'Wesley', 'Steven', 'Joe'],['Alice', 'Jill', 'Ana', 'Wendy', 'Jennifer', 'Sherry', 'Eva']]
lst = [name for i in names for name in i if name.count("e") ==2]
print(lst)

各种推导式:

字典推导式:

 

#将一个字典的key和value对调
mcase = {'a': 10, 'b': 34}
dic = {mcase[i]:i for i in mcase}
print(dic)

#例二:合并大小写对应的value值,将k统一成小写
mcase = {'a': 10, 'b': 34, 'A': 7, 'Z': 3}
dic2 = {i.lower():(mcase.get(i.upper(),0) + mcase.get(i.lower(),0)) for i in mcase}
print(dic2)

集合推导式:

squared = {x**2 for x in [1, -1, 2]}
print(squared)
# Output: set([1, 4])

练习题:

例1:  过滤掉长度小于3的字符串列表,并将剩下的转换成大写字母

例2:  求(x,y)其中x是0-5之间的偶数,y是0-5之间的奇数组成的元祖列表

例3:  求M中3,6,9组成的列表M = [[1,2,3],[4,5,6],[7,8,9]]

 

 

3)内置函数

内置函数: 一些常用的功能,python都给你封装好了,供你直接使用.

作用域相关:

globals()  无论在哪里调用用户打印的都是全局的.

locals()  只打印当前函数的变量,不打印上层函数的变量,如果这个在主函数打印的话,和globals一个效果.

 

其他相关:

eval 执行字符串类型的代码,并返回最终结果。

示例:

f = eval("1+2")
print(f)  #执行后会返回执行结果
#这个需要注意的是
dic = eval("{'a':2,'b':3}")
print(dic)
print(type(dic))

"""
执行结果如下:
3
{'a': 2, 'b': 3}
<class 'dict'>
"""

exec 执行字符串类型的代码。不返回任何值.

示例:

code = '''
for i in range(1, 11):
    print(i)
'''
print(exec(code))

"""
执行结果如下:
1
2
3
4
5
6
7
8
9
10
None

"""

 

print()函数,这个有两点要注意,有两个参数

print(123,456,sep=",",end="")

"""
执行结果:
123,456
sep 为变量之间用什么切割,end表示是否加换行
"""

 hash:获取一个对象(可哈希对象:int,str,Bool,tuple)的哈希值。注意每次相同内容的hash值是不一样的.
# print(hash('name'))
# print(hash(7117817419752622577))
# print(hash('name1'))
# print(hash('name2'))
# print(hash('name3'))
# print(hash(100))
# print(hash(1))
# print(hash(True))

 

callable 函数,查看对像是否是可调用的.

比如str是不可调用的,函数是可调用的.示例如下:

str = "133"
def fun():
    pass
print(callable(str))
print(callable(fun))
"""
执行结果如下:
False
True
"""

 

posted @ 2018-06-20 15:58  auxiaoliu  阅读(178)  评论(0编辑  收藏  举报