集合
集合:把不同的元素组成一起形成集合,是python基本的数据类型。
集合元素:组成集合的成员。
>>> x = [11,22,33,11]
>>> se = set(x)
>>> se
{33, 11, 22}
集合对象是一组无序排列的不重复的值。
创建集合
字符串,数字,列表和字典都可以作为集合中的元素,当用字典作为集合中的元素时,默认取字典中的Key作为集合中的元素。
1 >>> x = ()
2 >>> li = ['a','b','c']
3 >>> x = (li)
4 >>> x
5 ['a', 'b', 'c']
6 >>> x = set('abcdefg')
7 >>> x
8 {'a', 'g', 'c', 'f', 'b', 'd', 'e'}
9 >>> li = [11,22,33,44,55]
10 >>> y = set(li)
11 >>> y
12 {33, 11, 44, 22, 55}
13 >>> dict = {
14 ... 'cpu':12,
15 ... 'mem':16,
16 ... 'disk':'3.0T',
17 ... 'U位':'15'
18 ... }
19 >>> set(dict)
20 {'disk', 'cpu', 'mem', 'U位'}
集合本身是无序的,所以不能为集合创建索引或切片,只能循环遍历或使用in、not in来访问或判断集合元素
s.add()
s.update()
s.remove()
s.clear()
s1.intersection(s2) s1和s2的交集
>>> s1 = {11,22,33}
>>> s2 = {22,33,44}
>>> s1.intersection(s2)
{33, 22}
s1.difference(s2) s1中存在s2中不存在
>>> s1.difference(s2)
{11}
例:
现在字典1和字典2如下,要求用字典2去更新字典1,如果字典2中没有的key则在字典1中删除,字典2中有字典1中没有的key则在字典1中建立相应的key.
dict_1 = {
'cpu':16,
'mem':8,
'disk':'1.8T',
'U位':'25'
}
dict_2 = {
'cpu':12,
'mem':16,
'disk':'3.0T',
'U位':'15'
}
s1 = set(dict_1.keys())
s2 = set(dict_2.keys())
remove_key = s1.difference(s2)
add_key = s2.difference(s1)
update_key = s1.intersection(s2)
for i in remove_key:
del dict_1[i]
for i in add_key:
dict_1[i] = dict_2[i]
for i in update_key:
if dict_1[i] == dict_2[i]:
pass
else:
dict_1[i] = dict_2[i]
>>> dict_1 #字典更新完成
{'U位': '15', 'disk': '3.0T', 'cpu': 12, 'mem': 16}
函数
函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。
你可以定义一个由自己想要功能的函数,以下是简单的规则:
- 函数代码块以 def 关键词开头,后接函数标识符名称和圆括号()。
- 任何传入参数和自变量必须放在圆括号中间。圆括号之间可以用于定义参数。
- 函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。
- 函数内容以冒号起始,并且缩进。
- return [表达式] 结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回 None。
以下为一个最简单的函数,每次调用都会打印"this is a test"
def name ():
print('this is a test')
return
函数调用
定义一个函数只给了函数一个名称,指定了函数里包含的参数,和代码块结构。
这个函数的基本结构完成以后,你可以通过另一个函数调用执行,也可以直接从Python提示符执行。
以下为一个函数最简单的调用方法:
def name ():
print('this is a test')
return
name()
this is a test
函数参数的传递:
1、普通参数(严格按照顺序,将实际参数赋值给形式参数)
2、默认参数(必须放置在参数列表的最后)
3、指定参数(将实际参数赋值给制定的形式参数)
4、动态参数:
* 默认将传入的参数,全部放置在元组中
** 默认将传入的参数,全部放置在字典中,以key,value的方式显示
5、万能参数, *args,**kwargs
以下为各种传入参数的具体方法:
def test1(x,y):
print(x,y)
test1(10,20)
10 20
def test2(*args):
print(args)
test2([1,2,3,4,5])
([1, 2, 3, 4, 5],) #默认会将传入的参数作为一个元组
def test2(**args):
print(args)
test2(name='yang',age=18)
{'name': 'yang', 'age': 18}
全局变量和局部变量
定义在函数内部的变量拥有一个局部作用域,定义在函数外的拥有全局作用域。
局部变量只能在其被声明的函数内部访问,而全局变量可以在整个程序范围内访问。调用函数时,所有在函数内声明的变量名称都将被加入到作用域中。
name = 'yang'
def test():
name = 'zheng'
age = 28
test()
print(name)
yang
def test2():
global name
name = 'zheng'
age = 28
test2()
print(name)
zheng
在上面的例子中,首先定义了name = 'yang',然后在函数内部重新定义了这个变量,可以看到在函数外部这个变量的值并未改变,而在下面的例子中,用了global声明,此时定义的变量可以在全局范围内使用。
lambda表达式和列表解析
- lambda只是一个表达式,函数体比def简单很多。
- lambda的主体是一个表达式,而不是一个代码块。仅仅能在lambda表达式中封装有限的逻辑进去。
- lambda函数拥有自己的命名空间,且不能访问自有参数列表之外或全局命名空间里的参数。
- 虽然lambda函数看起来只能写一行,却不等同于C或C++的内联函数,后者的目的是调用小函数时不占用栈内存从而增加运行效率。
def number (x): return x + 1 #普通方式定义函数 print(number(123)) 124 lambda_1 = lambda x: x+1 print(lambda_1(123)) #以lambda表达式方式定义函数 124
内置函数
map
遍历序列,对序列中每个元素进行操作,最终获得一个新的序列。
li = [11,22,33]
lst = map(lambda x: x+1,li)
print(list(lst))
>>>[12, 23, 34] #对列表中每个元素都加1
li_1 = [11,22,33]
li_2 = [44,55,66]
li_3 = map(lambda a,b: a+b,li_1,li_2) #用li_1中第一个元素加上li_2中第一个,第二个加第二个,依次相加
print(list(li_3))
>>>[55, 77, 99]
filter
对序列中的元素进行过滤,最终用符合要求的元素再组成一个新的序列。
li = [11, 22, 33]
lst = filter(lambda x: x > 22, li)
print(list(lst))
>>>[33]
当然,你也可以用列表解析的方法完成上述要求。
li = [11,22,33]
lst = [x+1 for x in li] #加1
print(lst)
>>>[12, 23, 34]
li_1 = [11,22,33]
li_2 = [44,55,66]
lst = [(a+b) for a in li_1 for b in li_2 if li_1.index(a) == li_2.index(b) ] #对应相加
print(lst)
>>>[55, 77, 99]
li = [11,22,33]
lst = [x for x in li if x > 22] #筛选出大于22的
print(lst)
>>>[33]