前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >python3--列表推导式,生成器表达式,内置函数

python3--列表推导式,生成器表达式,内置函数

作者头像
py3study
发布2018-08-02 16:15:57
2.4K0
发布2018-08-02 16:15:57
举报
文章被收录于专栏:python3python3

python列表推导式

代码语言:javascript
复制
l = [i for i in range(10)]
print(l)
ll = ['选择{}'.format(i) for i in range(1,5)]
print(ll)

执行结果

blob.png
blob.png

生成器表达式

1,把列表解析的[]换成()得到的就是生成器表达式

2,列表解析与生成器表达式都是一种便利的编程方式,只不过生成器表达式更节省内存

3,python不但使用迭代器协议,让for循环变得更加通用,大部分内置函数,也是使用迭代器协议访问对象的,例如sum函数是python的内置函数,该函数使用迭代器协议访问对象,而生成器实现了迭代器协议,所以,我们可以直接这样计算一系列值的和

求1到3的x的2次方的和

代码语言:javascript
复制
print(sum(x ** 2 for x in range(4)))

执行结果14

各种推导式玩法

推导式套路

之前已经学习了最简单的列表推导式和生成器表达式,但是除此之外,其实还有字典推导式,集合推导式等等

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

代码语言:javascript
复制
variable = [out_exp_res for out_exp in input_list if out_exp == 2]
out_exp_res: 列表生产元素表达式,可以是有返回值的函数
for out_exp in input_list: 迭代input_list将out_exp传入out_exp_res表达式中
if out_exp == 2 根据条件过滤哪些值可以

列表推导式

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

代码语言:javascript
复制
s1 = [i for i in range(30) if i % 3 == 0]
print(s1)

执行结果

[0, 3, 6, 9, 12, 15, 18, 21, 24, 27]

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

代码语言:javascript
复制
s1 = [i**2 for i in range(30) if i % 3 == 0]
print(s1)

执行结果

[0, 9, 36, 81, 144, 225, 324, 441, 576, 729]

例3:找到嵌套列表中名字含有两个'e'的所有名字

代码语言:javascript
复制
names = [['Tom', 'Billy', 'Jefferson', 'Andrew', 'Wesley', 'Steven', 'Joe'],
         ['Alice', 'Jill', 'Ana', 'Wendy', 'Jennifer', 'Sherry', 'Eva']]

s2 = [i for i in names for i in i if i.count('e') == 2]
print(s2)

执行结果

['Jefferson', 'Wesley', 'Steven', 'Jennifer']

字典推导式

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

代码语言:javascript
复制
mcase = {'a': 10, 'b': 34}
s2 = {mcase[k]: k for k in mcase}
print(s2)

执行结果

{10: 'a', 34: 'b'}

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

代码语言:javascript
复制
mcase = {'a': 10, 'b': 34, 'A': 7, 'Z': 3}
s2 = {k.lower(): mcase.get(k.lower(),  0) + mcase.get(k.upper(), 0) for k in mcase.keys()}
print(s2)

执行结果

{'a': 17, 'z': 3, 'b': 34}

集合推导式

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

代码语言:javascript
复制
s2 = {x**2 for x in [1,-1,2]}
print(s2)

执行结果

{1, 4}

练习题:

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

代码语言:javascript
复制
s1 = ['asd', 'aaa', 'abcd', 'dhuifw']
s2 = [i.upper() for i in s1 if len(i) > 3]
print(s2)

执行结果

['ABCD', 'DHUIFW']

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

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

代码语言:javascript
复制
M = [[1,2,3],[4,5,6],[7,8,9]]
s1 = [i[-1] for i in M]
print(s1)

执行结果

[3, 6, 9]

内置函数

blob.png
blob.png

什么是内置函数?就是python给你提供的,拿来直接用的函数,比如print,input等等,截止到python版本3.6,现在python一共为我们提供了68个内置函数,它们就是python提供给你直接可以拿来使用的函数

blob.png
blob.png

1 作用域相关

locals:函数会以字典的类型返回当前位置的全部局部变量

globals:函数以字典的类型返回全部全局变量

例子

代码语言:javascript
复制
a = 1
b = 2
def func(*argv):
    c = 2
    print(locals())
    print(globals())
func(3)

执行结果

blob.png
blob.png

2:其它相关

字符串类型代码的执行eval,exec,complie

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

例1

代码语言:javascript
复制
print(eval('2 + 2'))
n = 81
print(eval("n + 4"))
eval('print(666)')

执行结果

4

85

666

exec:执行字符串类型的代码

代码语言:javascript
复制
s = '''
for i in [1,2,3]:
    print(i)
'''
exec(s)

执行结果

1

2

3

compile:将字符串类型的代码编译,代码对象能够通过exec语句来执行或者eval()进行求值

代码语言:javascript
复制
code1 = 'for i in range(0,10):print(i)'
compile1 = compile(code1, '', 'exec')
exec(compile1)

执行结果

1,2,3,4,5,6,7,8,9

有返回值的字符串形式的代码用eval,没有返回值的字符串形式的代码用exec,一般不用compile

输入输出相关input,print

input:函数接收一个标准输入数据,返回为string类型

print:打印输出

代码语言:javascript
复制
''' 源码分析
def print(self, *args, sep=' ', end='\n', file=None): # known special case of print
    """
    print(value, ..., sep=' ', end='\n', file=sys.stdout, flush=False)
    file:  默认是输出到屏幕,如果设置为文件句柄,输出到文件
    sep:   打印多个值之间的分隔符,默认为空格
    end:   每一次打印的结尾,默认为换行符
    flush: 立即把内容输出到流文件,不作缓存
    """'''
print(111,222,333,sep='*')
print(111, end='')  # 两行的结果
print(222)
f = open('log','w',encoding='utf-8')
print('写入文件',file=f,flush=True)

执行结果

blob.png
blob.png

内存相关hash ,id

hash:获取一个对象(和哈希对象:int,str,bool,tuple)的哈希值

代码语言:javascript
复制
print(hash(123))
print(hash('123'))
print(hash(True))
print(hash(False))
print(hash((1,2,3)))

执行结果

123

-1089558323302803215

1

0

2528502973977326415

id:用于获取对象的内存地址

代码语言:javascript
复制
print(id(123))
print(id('123'))

1679778400

2709492781664

文件操作相关

open:函数用于打开一个文件,创建一个file对象,相关的方法才可以调用它进行读写

模块相关

__import__: 函数用于动态加载类和函数

帮助

help:函数用于查看函数或模块用途的详细说明

print(help(list))

blob.png
blob.png

调用相关

callable:函数用于检查一个对象是否可调用,如果返回True,object仍然可能调用失败,但如果返回为False,调用对象object绝对不会成功

代码语言:javascript
复制
print(callable(0))
print(callable('hello'))

def add(a,b):
    return a + b
print(callable(add))

class A:  # 类
    def test(self):
        return 0
print(callable(A))  # 类返回True
a = A()
print(callable(a))  # 没有实现__call__,返回False

执行结果

False

False

True

True

False

查看内置属性

dir: 函数不带参数时,返回当前范围内的变量,方法和定义的类型列表:带参数时,返回参数的属性,方法列表。如果参数包含方法__dir__(),该方法将被调用,如果参数不包含__dir__(),该方法将最大限度收集参数信息

print(dir([])) #查看列表的方法

blob.png
blob.png

迭代器生成器相关

range:函数可以创建一个整数对象,一般用在for循环中

next:内部实际使用了__next__方法,返回迭代器的下一个项目

代码语言:javascript
复制
it = iter([1,2,3,4,5])
#循环
while True:
    try:
        #获取一下个值
        x = next(it)
        print(x)
    except StopIteration:
        #遇到StopIteration就退出循环
        break

执行结果

1

2

3

4

5

iter: 函数用来生成迭代器(将一个可迭代对象生成迭代器)

代码语言:javascript
复制
from collections import Iterable
from collections import Iterator
l = [1,2,3]
print(isinstance(l,Iterable))  # True
print(isinstance(l,Iterator))  # False
l1 = iter(l)
print(isinstance(l1,Iterable))  # True
print(isinstance(l1,Iterator))  # True

执行结果

True

False

True

True

基础数据类型相关

数字相关

数据类型

bool: 用于将给定参数转换为布尔类型,如果没有参数,返回False

int: 函数用于将一个字符串或数字转换为整型

代码语言:javascript
复制
print(int())
print(int('12'))
print(int(3.6))
print(int('0100',base=2)) #将2进制的0100转化成十进制,结果为4

执行结果为

0

12

3

4

float:函数用于将整数和字符串转换成浮点数

complex:函数用于创建一个值为real + imag*j的复数或者转化一个字符串为复数,如果第一个参数为字符串,则不需要指定第二个参数

代码语言:javascript
复制
print(complex(1,2))
print(complex(1))
#注意,这个地方在'+'号两边不能有空格,也就是不能写成'1 + 2j',否则报错
print(complex('1+2j'))

执行结果

(1+2j)

(1+0j)

(1+2j)

进制转换

bin:将十进制转换成二进制并返回

oct:将十进制转化成八进制字符串并返回

hex:将十进制转化成十六进制字符串并返回

代码语言:javascript
复制
print(bin(10),type(bin(10)))
print(oct(10),type(oct(10)))
print(hex(10),type(hex(10)))

执行结果

0b1010

0o12

0xa

数学运算

abs:函数返回数字的绝对值

divmod:计算除数与被除数的结果,返回一个包含商和余数的元组(a//b,a%b)

round: 保留浮点数的小数位数,默认保留整数

pow:求x**y次幂(三个参数为x**y的结果对z取余)

代码语言:javascript
复制
print(abs(-5))
print(divmod(7,2))
print(round(7/3,2))
print(round(7/3))
print(round(3.32567,3))
print(pow(2,3)) #两个参数为2**3次幂
print(pow(2,3,3)) #三个参数为2**3次幂,对3取余

执行结果

5

(3, 1)

2.33

2

3.326

8

2

sum:对可迭代对象进行求和计算(可设置初始值)

min:返回可迭代对象的最小值(可加key,key为函数名,通过函数的规则,返回最小值)

max:返回可迭代对象的最大值(可加key,key为函数名,通过函数的规则,返回最大值)

代码语言:javascript
复制
print(sum([1,2,3]))
print(sum([1,2,3],100))
print(min([1,2,3])) #返回最小值
ret = min([1,2,-5,],key=abs) #按照绝对值的大小,返回此序列最小值
print(ret)
dic = {'a':3,'b':3,'c':1}

# x为dic的key,lambda的返回值(即dic的值进行比较)返回最小的值对应的键
print(min(dic, key=lambda x:dic[x]))

print(max([1,2,3])) #返回此序列最大值
ret1 = max([1,2,-5],key=abs) #返回绝对值的大小,返回此序列最大值
print(ret1)

dic1 = {'a':3,'b':2,'c':1}
# x为dic的key,lambda的返回值(即dic的值进行比较),返回最大的值对应的键
print(max(dic,key=lambda x:dic[x]))

执行结果

6

106

1

1

c

3

-5

a

和数据结构相关

列表和元组

    list:将一个可迭代对象转化成列表(如果是字典,默认将key作为列表的元素)

    tuple:将一个可迭代对象转化成元组(如果是字典,默认将key作为元组的元素)

例子

代码语言:javascript
复制
l = list((1,2,3))
print(l)
l1 = list({1,2,3})
print(l1)
l2 = list({'k1':1,'k2':2})
print(l2)
tu = tuple([1,2,3])
print(tu)
tu1 = tuple((1,2,3))
print(tu1)
tu2 = tuple({'k1':1,'k2':2})
print(tu2)

执行结果

[1, 2, 3]

[1, 2, 3]

['k1', 'k2']

(1, 2, 3)

(1, 2, 3)

('k1', 'k2')

相关内置函数

    reversed:将一个列表翻转,并返回此翻转序列的迭代器

    slice:构造一个切片对象,用于列表的切片

例子

代码语言:javascript
复制
ite = reversed(['a','2',3,'c',4,2])
for i in ite:
    print(i)

li = ['a','b','c','d','e']
sli_obj = slice(3)
print(li[sli_obj])
sli_obj = slice(0,4,2)
print(li[sli_obj])

执行结果

2

4

c

3

2

a

['a', 'b', 'c']

['a', 'c']

字符串相关

    str:将数据转化成字符串

    format:与具体数据相关,用于计算各种小数,精数等

例子

代码语言:javascript
复制
print(format('test','20'))
print(format('test','^20'))
s1 = format(3, 'b')  # 转换成二进制
s2 = format(97, 'c')  # 转换成unicode字符
s3 = format(11, 'd')  # 转化成10进制
s4 = format(11, 'o')  # 转换成8进制
s5 = format(11, 'x')  # 转换成16进制 小写字母表示
s6 = format(11, 'X')  # 转换成16进制 大写字母表示
print(s1)
print(s2)
print(s3)
print(s4)
print(s5)
print(s6)

执行结果

test                

                test

        test        

11

a

11

13

b

B

bytes: 用于不同编码之间的转化

代码语言:javascript
复制
s = '你好'
bs = s.encode('utf-8')
print(bs)
s1 = bs.decode('utf-8')
print(s1)
bs = bytes(s, encoding='utf-8')
print(bs)
b = '你好'.encode('gbk')
b1 = b.decode('gbk')
print(b1.encode('utf-8'))

执行结果

b'\xe4\xbd\xa0\xe5\xa5\xbd'

你好

b'\xe4\xbd\xa0\xe5\xa5\xbd'

b'\xe4\xbd\xa0\xe5\xa5\xbd'

bytearry:返回一个新字节数组,这个数组里的元素是可变的,并且每个元素的值范围 0 <= x < 256

代码语言:javascript
复制
ret = bytearray('sam', encoding='utf-8')
print(id(ret))
print(ret)
print(ret[0])
ret[0] = 65
print(ret)
print(id(ret))

执行结果

blob.png
blob.png

memoryview

代码语言:javascript
复制
ret = memoryview(bytes('你好', encoding='utf-8'))
print(len(ret))
print(ret)
print(bytes(ret[:3]).decode('utf-8'))
print(bytes(ret[3:]).decode('utf-8'))

执行结果

6

<memory at 0x0000018F0BC4D1C8>

ord:输入字符找该字符编码的位置

chr:输入位置数字找出其对应的字符

ascii:是ascii码中的返回该值,不是就返回/u

代码语言:javascript
复制
# ord 输入字符找该字符编码的位置
print(ord('a'))
print(ord('中'))

# chr 输入位置数字找出其对应的字符
print(chr(97))
print(chr(20013))

# 是ascii码中的返回该值,不是就返回/u
print(ascii('a'))
print(ascii('中国'))

执行结果

97

20013

a

'a'

'\u4e2d\u56fd'

repr:返回一个对象的string形式(原形毕露)

代码语言:javascript
复制
# %r 原封不动的写出来
name = 'sam'
print('我叫{}'.format(name))

# repr原形毕露
print(repr('{"name": "sam"}'))
print('{"name": "sam"}')

执行结果

我叫sam

'{"name": "sam"}'

{"name": "sam"}

数据集合

dict:创建一个字典

set:创建一个集合

frozenset:返回一个冻结的集合,冻结后集合不能再添加或删除任何元素

len:返回一个对象中元素的个数

sorted:对所有可迭代的对象进行排序操作

代码语言:javascript
复制
L = [('a', 1), ('c', 3), ('d', 4), ('b', 2),]
print(sorted(L, key=lambda x:x[1])) # 利用key

students = [('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10)]
print(sorted(students, key=lambda s: s[2]))  # 利用key按年龄排序

print(sorted(students, key=lambda s: s[2], reverse=True))  # 按降序

执行结果

[('a', 1), ('b', 2), ('c', 3), ('d', 4)]

[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]

[('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10)]

enumerate:枚举,返回一个枚举对象

代码语言:javascript
复制
print(enumerate([1,2,3]))
for i in enumerate([1,2,3]):
    print(i)
for i in enumerate([1,2,3],100):
    print(i)

执行结果

<enumerate object at 0x0000029F8542E8B8>

(0, 1)

(1, 2)

(2, 3)

(100, 1)

(101, 2)

(102, 3)

all:可迭代对象中,全部都是True才是True

any:可迭代对象中,有一个True就是True

代码语言:javascript
复制
print(all([1,2,True,0]))
print(any([1,'',0]))

执行结果

False

True

zip:函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同

代码语言:javascript
复制
l1 = [1,2,3,]
l2 = ['a','b','c',5]
l3 = ('*','**',(1,2,3))
for i in zip(l1,l2,l3):
    print(i)

执行结果

(1, 'a', '*')

(2, 'b', '**')

(3, 'c', (1, 2, 3))

filter:过滤

代码语言:javascript
复制
# filter 过滤,通过你的函数,过滤一个可迭代对象,返回的是True
# 类似于[i for i in range(10) if i > 3]
def func(x): return x % 2 == 0
ret = filter(func,[1,2,3,4,5,6,7])
print(ret)
for i in ret:
    print(i)

执行结果

<filter object at 0x00000177ADEAA1D0>

2

4

6

map:会根据提供的函数对指定序列做映射

代码语言:javascript
复制
ret  = map(square, [1,2,3,4,5])  # 计算列表各个元素的平方
for i in ret:
    print(i)

ret1 = map(lambda x:x**2, [1,2,3,4,5])  # 使用lambda匿名函数
for i in ret1:
    print(i)

# 提供了两个列表,对相同位置的列表数据进行相加
ret2 = map(lambda x,y :x+y, [1,3,5,7,9], [2,4,6,8,10])
for i in ret2:
    print(i)

匿名函数lamdba

匿名函数:为了解决那些功能很简单的需求而设计的一句话函数

代码语言:javascript
复制
def calc(n):
    return n ** n
print(calc(10))

# 换成匿名函数
calc1 = lambda n:n**n
print(calc1(10))

执行结果

10000000000

10000000000

blob.png
blob.png

上面是对calc这个匿名函数的分析,下面给出了一个关于匿名函数格式的说明

函数名 = lamdba 参数:返回值

#参数可以有多个,用逗号隔开

#匿名函数不管逻辑多复杂,只能写一行,且逻辑执行结束后的内容就是返回值

#返回值和正常的函数一样可以使任意数据类型

可以看出,匿名函数并不是真的不能有名字

匿名函数的调用和正常的调用也没有什么区别,就是函数名(参数)就可以了

匿名函数与内置函数举例

代码语言:javascript
复制
l = [3,2,100,999,213,1111,31121,333]
print(max(l))
dic = {'k1':10,'k2':100,'k3':30}
print(max(dic))
print(dic[max(dic,key=lambda k:dic[k])])

res = map(lambda x:x**2,[1,5,7,4,8])
for i in res:
    print(i)

res1 = filter(lambda x:x>10,[5,8,11,9,15])
for i in res1:
    print(i)
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-04-06 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档