集合
- 集合是由唯一元素组成的无续集。
-
创建方式如下:
>>> a = {1,2,}
>>> type(a)
<class 'set'>
>>> a = set([1,2,3])
>>> a
{1, 2, 3}
>>> type(a)
<class 'set'>
>>>
- 集合的常用运算:
函数 | 运算符 | 说明 |
a.add(x) | - | 为集合a添加元素x |
a.remove(x) | - | 删除元素 |
a.union(b) | a|b | 返回并集 |
a.intersection(b) | a&b | 交集 |
a.difference(b) | a-b | 差集 |
a.symmetric_difference(b) | a^b | 对称差集,(a|b)-(a&b) |
a.issubset(b) | - | 判断a是否是b的子集 |
a.issuperset(b) | - | 判断a是否包含b |
a.isdisjoint(b) | - | 判断a与b交集是否为空 |
序列推导式
-
可以非常简洁的构造一个新序列。
#将列表中字符串的第一个字母大写得到新列表。(可以用map实现相同的功能)
>>> names = ['xiaoming','liming']
>>> [x[0].upper()+x[1:] for x in names]
['Xiaoming', 'Liming']
>>> map(lambda x:x[0].upper()+x[1:],names)
<map object at 0x0000015D0ECBAF60>
>>> list(map(lambda x:x[0].upper()+x[1:],names))
['Xiaoming', 'Liming']
>>>
-
推导式中还可以加过滤条件
#返回列表中长度大于3的字符串并大写
>>> strs = ['abcd','abc','a']
>>> [x.upper() for x in strs if len(x)>3]
['ABCD']
>>>
嵌套序列推导式
- 简化由列表组成的列表的遍历
-
嵌套for循环中各个for顺序是怎样的,嵌套推导式中各个for表达式的顺序就是怎样的。
>>> a = [['1','2'],['b','c']]
>>> [x for lists in a for x in lists]
['1', '2', 'b', 'c']
>>> [x for x in [lists for lists in a]]
[['1', '2'], ['b', 'c']]
>>> [[x for x in lists] for lists in a]
[['1', '2'], ['b', 'c']]
>>>
函数
- 用关键字def声明,使用return关键字返回。
- 函数可以有位置参数,关键字参数。关键字参数通常用于指定默认值或可选参数。
- 函数参数的限制在于:关键字参数必须位于位置参数之后。
- 函数可以通过返回元组,再进行拆包的方式实现返回多个值。
- 函数亦为对象。
- 匿名函数关键字lambda,没有提供名称属性。
闭包:返回函数的函数
- 闭包就是由其他函数动态生成并返回的函数。
- 闭包可以访问其创建者的局部命名空间的变量。
- 虽然可以修改任何内部状态对象,但不能绑定(比如:a = 1)外层函数作用域中的变量。一个解决办法是修改字典或列表而不是绑定变量。
- 这种模式其实也是用类来实现的。
代码:
def people(name):
names = name#设置姓名
def say_age(years):#根据年份计算年龄
print('{0}今年{1}岁'.format(names,years-1995))
return say_age
s = people('小明')#设置名字
for i in range(2015,2017):
print('年份:',i)
s(i)
输出:
年份: 2015
小明今年20岁
年份: 2016
小明今年21岁
>>>
拓展调用语法*args,**kwargs
- * 用来传递任意个无名字参数,这些参数会一个Tuple的形式访问。
- **用来处理传递任意个有名字的参数,这些参数用dict来访问。
代码:
def say_hello_then_call_f(f,*g,**kwargs):
print('args is',g)
print('kwargs is',kwargs)
print('开始调用函数:%s'%f)
return f(*g,**kwargs)
def g(x,y,z=1):
return (x+y)/z
print(say_hello_then_call_f(g,1,1,z=23))
输出:
args is (1, 1)
kwargs is {'z': 23}
开始调用函数:<function g at 0x0000013A67B27F28>
0.08695652173913043
柯里化:部分参数应用
- 柯里化指的是从现有函数中派生出新函数的技术。
代码:
def people_say_age(names,years):#根据年份计算年龄
print('{0}今年{1}岁'.format(names,years-1995))
s = lambda years:people_say_age('小明',years)
for i in range(2015,2017):
print('年份:',i)
s(i)
输出:
年份: 2015
小明今年20岁
年份: 2016
小明今年21岁
>>>
生成器
- Python有统一的迭代器协议,能以一致的方式对序列进行迭代。
- 迭代器是一种特殊对象,在诸如for循环之类的上下文中向python解释器输送对象。
- 生成器(generator)是构造新的可迭代对象的一种简单方式。生成器以延迟的方式返回一个值序列,即每返回一个值后暂停,直到下一个值被请求时继续。通过关键字yield声明。
代码:
"""
生成器:
每次调用的时候print出是第d次调用
返回次数的三次方
"""
def n_genrators():
s = 1
while s<5:
print('n_genrators提示:第%d次调用'%s)
yield s**3
s +=1
#生成器的实例化
gen = n_genrators()
#返回生成器的类型名
print('gen类型名:{0}'.format(type(gen)))
#next方法取数
print("next取值=",next(gen))
#for循环取数
for x in gen:
print('x = %d'%x)
#生成器已经close(),报错StopIteration
print("next取值=",next(gen))
输出:
gen类型名:<class 'generator'>n_genrators提示:第1次调用
next取值= 1
n_genrators提示:第2次调用
x = 8
n_genrators提示:第3次调用
x = 27
n_genrators提示:第4次调用
x = 64
Traceback (most recent call last):
File "C:/Users/tinysoft/Desktop/ggg.py", line 27, in <module>
print("next取值=",next(gen))
StopIteration
生成器表达式
- 生成器表达式是构造生成器的最简单方式。
- 类似于列表字典的推导式,把列表推导式两边的方括号变为圆括号即可。
代码:
gen = (x**3 for x in range(5))
print("gen的类型名:%s"%type(gen))
for x in gen:
print("x=%d"%x)
输出:
gen的类型名:<class 'generator'>x=0
x=1
x=8
x=27
x=64
>>>