文成小盆友python-num3 集合,函数,-- 部分内置函数
Posted 文成小盆友
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了文成小盆友python-num3 集合,函数,-- 部分内置函数相关的知识,希望对你有一定的参考价值。
本接主要内容:
- set -- 集合数据类型
- 函数
- 自定义函数
- 部分内置函数
一。set 集合数据类型
set集合,是一个无序且不重复的元素集合
- 集合基本特性
- 无序
- 不重复
- 创建集合
#!/bin/env python s1 = {"1","2","3","4"} ##或者 s2 = set()
- set 提供的功能
1 class set(object): 2 """ 3 set() -> new empty set object 4 set(iterable) -> new set object 5 6 Build an unordered collection of unique elements. 7 """ 8 def add(self, *args, **kwargs): # real signature unknown 9 """ 10 Add an element to a set,添加元素 11 12 This has no effect if the element is already present. 13 """ 14 pass 15 16 def clear(self, *args, **kwargs): # real signature unknown 17 """ Remove all elements from this set. 清除内容""" 18 pass 19 20 def copy(self, *args, **kwargs): # real signature unknown 21 """ Return a shallow copy of a set. 浅拷贝 """ 22 pass 23 24 def difference(self, *args, **kwargs): # real signature unknown 25 """ 26 Return the difference of two or more sets as a new set. A中存在,B中不存在 27 28 (i.e. all elements that are in this set but not the others.) 29 """ 30 pass 31 32 def difference_update(self, *args, **kwargs): # real signature unknown 33 """ Remove all elements of another set from this set. 从当前集合中删除和B中相同的元素""" 34 pass 35 36 def discard(self, *args, **kwargs): # real signature unknown 37 """ 38 Remove an element from a set if it is a member. 39 40 If the element is not a member, do nothing. 移除指定元素,不存在不保错 41 """ 42 pass 43 44 def intersection(self, *args, **kwargs): # real signature unknown 45 """ 46 Return the intersection of two sets as a new set. 交集 47 48 (i.e. all elements that are in both sets.) 49 """ 50 pass 51 52 def intersection_update(self, *args, **kwargs): # real signature unknown 53 """ Update a set with the intersection of itself and another. 取交集并更更新到A中 """ 54 pass 55 56 def isdisjoint(self, *args, **kwargs): # real signature unknown 57 """ Return True if two sets have a null intersection. 如果没有交集,返回True,否则返回False""" 58 pass 59 60 def issubset(self, *args, **kwargs): # real signature unknown 61 """ Report whether another set contains this set. 是否是子序列""" 62 pass 63 64 def issuperset(self, *args, **kwargs): # real signature unknown 65 """ Report whether this set contains another set. 是否是父序列""" 66 pass 67 68 def pop(self, *args, **kwargs): # real signature unknown 69 """ 70 Remove and return an arbitrary set element. 71 Raises KeyError if the set is empty. 移除元素 72 """ 73 pass 74 75 def remove(self, *args, **kwargs): # real signature unknown 76 """ 77 Remove an element from a set; it must be a member. 78 79 If the element is not a member, raise a KeyError. 移除指定元素,不存在保错 80 """ 81 pass 82 83 def symmetric_difference(self, *args, **kwargs): # real signature unknown 84 """ 85 Return the symmetric difference of two sets as a new set. 对称差集 86 87 (i.e. all elements that are in exactly one of the sets.) 88 """ 89 pass 90 91 def symmetric_difference_update(self, *args, **kwargs): # real signature unknown 92 """ Update a set with the symmetric difference of itself and another. 对称差集,并更新到a中 """ 93 pass 94 95 def union(self, *args, **kwargs): # real signature unknown 96 """ 97 Return the union of sets as a new set. 并集 98 99 (i.e. all elements that are in either set.) 100 """ 101 pass 102 103 def update(self, *args, **kwargs): # real signature unknown 104 """ Update a set with the union of itself and others. 更新 """ 105 pass
- add 增加元素
#!/bin/env python s1 = {"1","2"} s1.add("234") print(s1) ##打印结果如下: {\'234\', \'2\', \'1\'} Process finished with exit code 0
- clear 清除元素
#!/bin/env python ## s1 = {"1","2"} s1.add("234") print(s1) s1.clear() print(s1) #显示如下 {\'234\', \'1\', \'2\'} set() #看见原先集合内的数据已经清空 Process finished with exit code 0
- copy 集合拷贝 -- 浅拷贝
s1 = {"1","2","123","[1,2,3,4]"} s2 = s1.copy() print(s2) ## 显示如下 {\'2\', \'1\', \'[1,2,3,4]\', \'123\'} Process finished with exit code 0
- difference 方法
如下使用,表示为s1中存在但是s2中没有的元素
s1 = {1,2,3} s2 = {2,3,4} s3 = s1.difference(s2) print(s3) ##打印如下: {1} Process finished with exit code 0
- symmetric_difference
如下使用为 s1中存在但是s2中不存在的元素 + s2中存在但是s1中不存在的元素
s1 = {1,2,3} s2 = {2,3,4} s3 = s1.difference(s2) print(s3) s4 = s1.symmetric_difference(s2) print(s4) ##显示如下: {1} {1, 4} Process finished with exit code 0
- difference_update
s1 = {1,2,3} s2 = {2,3,4} s1.difference_update(s2) print(s1) ##显示 如下: {1} Process finished with exit code 0 ##跟difference不同之处在于update会改变原先的集合(直接更新)
- discard
删除指定的元素,定指定的元素不存在时不报错(比较常用的一种删除方式)
s1 = {1,2,3}
s1.discard(1)
s1.discard(123) #此元素不存在 但是依然能够执行不报错
print(s1)
##显示如下: {2, 3} Process finished with exit code 0
- pop
移除某个元素随机的,不常用,并且会返回这个移除的值
s1 = {1,2,3} s2 = s1.pop() print(s1) print(s2,type(s2)) #显示如下: {2, 3} 1 <class \'int\'> Process finished with exit code 0 ################################## s1 = {"sdfjsd",2,3} s2 = s1.pop() print(s1) print(s2,type(s2)) #显示如下 {2, 3} sdfjsd <class \'str\'> Process finished with exit code 0
- remove
当remove掉存在的元素时会报错
s1 = {"sdfjsd",2,3} s1.remove(2) print(s1) #显示如下 {\'sdfjsd\', 3} ##存在的元素并没有报错 Process finished with exit code 0 #### s1 = {"sdfjsd",2,3} s1.remove(13) print(s1) #显示如下 Traceback (most recent call last): File "D:/oldboy/projects/s13/day3/sendmail.py", line 146, in <module> s1.remove(13) KeyError: 13 Process finished with exit code 1 ##由上可见 remove不存在的元素会导致执行失败
- intersection
- intersection_update ---同样的改变原来集合
取得两个集合的交集
s1={1,2,3,4} s2={2,3,4,5} s3=s1.intersection(s2) print(s3) ##显示如下 {2, 3, 4} Process finished with exit code 0
- union
取得两个元素的并集
s1={1,2,3,4} s2={2,3,4,5} s3=s1.union(s2) print(s3) #显示如下: {1, 2, 3, 4, 5} Process finished with exit code 0
- update
update()中的元素为可迭代的元素 如:字符串可迭代 列表可迭代 元组可迭代,显示如下
s1={1,2,3,4} s1.update(["e",5,6,7,"dd",("d",12)]) print(s1) #显示如下: {1, 2, 3, 4, 5, 6, 7, (\'d\', 12), \'dd\', \'e\'} Process finished with exit code 0
set集合应用练习:
应用需求大致如下:
模拟cmdb中资源管理情况下内存变化的探测
如下个字典中存放的分别为老的内存情况和新的内存情况,其中 #1 --代表物理的内存插槽的编号,后面的数值代表内存的大小
old_dic = { "#1":8, "#2":16, "#4":2, } new_dic = { "#1":8, "#2":4, "#3":2, }
需求为根据新的字典中的内容将最新的一个字典获取到
- 思路
分别定义两个集合一个存放老的插槽信息s1,一个存放新的插槽信息s2
然后通过几个的方法找到需要删除的插槽 找到需要增加的 再找出有可能需要更新的
- 分析
需要删除的为s1中存在但是s2中不存在的
应该增加的是s2中有但是s1没有的
需啊更新的为,s2中存在s1中也存在但是s1中的这个值和s2中的这个值不同,以s2中的这个值来作为最新更新
- 具体实现如下
old_dic = { "#1":8, "#2":16, "#4":2, } new_dic = { "#1":8, "#2":4, "#3":2, } ##分别定义两个字典用于存放老的 新的信息 #如下分别定义两个集合,分别存放老的插槽信息,新的插槽信息 old_set = set(old_dic.keys()) new_set = set(new_dic.keys()) print(old_set) print(new_set) ##需要删除的 del_set = old_set.difference(new_set) print(del_set) ##需要增加的 add_set = new_set.difference(old_set) print(add_set) ##有可能需要更新的 update_set = old_set.intersection(new_set) print(update_set) ###操作字典将老的中的删除掉 for i in del_set: del old_dic[i] print(old_dic) #需要增加的,将老的增加上 for i in add_set: old_dic[i] = new_dic[i] print(old_dic) #需要更新的: for i in update_set: if old_dic[i] != new_dic[i]: old_dic[i] = new_dic[i] print(old_dic) ###如此打印结果如下: {\'#4\', \'#1\', \'#2\'} ##老的集合 {\'#3\', \'#1\', \'#2\'} ##新的集合 {\'#4\'} #需要删除的 {\'#3\'} #需要增减 {\'#1\', \'#2\'} #有可能需要修改的 {\'#1\': 8, \'#2\': 16} #删除后老字典的值 {\'#1\': 8, \'#2\': 16, \'#3\': 2} #增加后字典的值 {\'#1\': 8, \'#2\': 4, \'#3\': 2} #最后按照新的修改后的值 ###以上就完成了更新
二.python中的函数--懒惰即美德
有了函数之后就不必反反复复的向计算机传递同样的指令了。增强了代码的可读性和代码的重复利用性。
1.自定义函数
- 声明函数
函数的声明:
def 空格 函数名 括号 :
函数体
...
...
返回值
如下例子
def name (): print("这是一个函数") name() ##显示如下: 这是一个函数 Process finished with exit code 0
分别解析如下:
- 1.def --- 为函数关键字
- 2.name --- 函数的名称日后根据函数名调用函数
- 3.() --- 固定格式(括号内可以填参数)-参数是为函数体提供数据
- 4.print("这是一个函数") ---函数体:具体的此函数的内容
- 5.函数 还有返回值 ---可以给调用者返回数据, python的函数中如果不设定函数的返回 值则默认返回 True or Flse 。
小例子 :定义 一个发邮件函数,当掉用时直接给指定的地址发送邮件:
#!/bin/env python def sendmail (): import smtplib from email.mime.text import MIMEText from email.utils import formataddr msg = MIMEText(\'邮件内容\', \'plain\', \'utf-8\') msg[\'From\'] = formataddr(["武沛齐", \'wptawy@126.com\']) msg[\'To\'] = formataddr(["走人", \'424662508@qq.com\']) msg[\'Subject\'] = "主题" server = smtplib.SMTP("smtp.126.com", 25) server.login("wptawy@126.com", "***此处填写密码***") server.sendmail(\'wptawy@126.com\', [\'1175677897@qq.com\', ], msg.as_string()) server.quit() sendmail()
- 有函数的python程序执行顺序:
当刚开始定义 一个 函数时,并不会 执行函数体中的内容,只有在调用时才会再执行函数体中的内容。
如下例子:
# -*- coding:utf-8 -*- # Author:wencheng.zhao print("首先执行") def f1 (): print("这是一个函数1") def f1 (): print("这是一个函数2") f1() ##打印结果 首先执行 这是一个函数2 Process finished with exit code 0 ##定义第二个f1的 函数时会把之前的f1的函数覆盖掉
- 关于函数的return
在函数中一旦执行return,函数执行过程立即终止
# -*- coding:utf-8 -*- # Author:wencheng.zhao def f1 (): print("这是一个函数1") return "123456" print("我将不会 得到执行") result = f1() ##将函数体中return的值赋值给 result print(result) ###显示如下 这是一个函数1 123456 Process finished with exit code 0
- 函数的参数
使用参数的好处是,更大话的提高了代码的可利用性,针对不同处调用参数时传不同的参数值即可如下简单的例子
# -*- coding:utf-8 -*- # Author:wencheng.zhao def name (name): print("你输入的名字为: %s"%name) name("赵文成")
如上:函数名后面括号中的name为参数 称为形式参数
函数中参数的类型:
-
-
- 普通参数
- 默认参数
- 指定参数
- 动态参数
- “万能参数”
-
- 普通参数
如上一个例子中name 即为一个普通参数-形式参数 -- 简称为形参
在掉用参数时传递的内容“赵文成”则为实际参数 -- 简称为实参
如下例子中说明多个普通参数当传递时是一一对应的:
1 # -*- coding:utf-8 -*- 2 # Author:wencheng.zhao 3 def name (name,add,age): 4 print("你输入的名字为: %s,你的住址为: %s,你的年龄为%s"%(name,add,age)) 5 6 7 name("赵文成","北京","26") 8 9 ##显示如下: 10 你输入的名字为: 赵文成,你的住址为: 北京,你的年龄为26 11 12 Process finished with exit code 0
- 默认参数
默认参数是在普通参数处设定一个默认值,注意必须将默认参数设置到普通参数的后面:
def name (name,add,age,phone=11111111111): print("你输入的名字为: %s,你的住址为: %s,你的年龄为%s, 你的手机号码为%s"%(name,add,age,phone)) name("赵文成","北京","26") ##显示如下: 你输入的名字为: 赵文成,你的住址为: 北京,你的年龄为26, 你的手机号码为11111111111 Process finished with exit code 0 ###如上在调用时没有传递参数则函数体中的值为默认值!!!! ###如下也 可以在调用时传递参数,这函数体中以传递的参数为准 # -*- coding:utf-8 -*- # Author:wencheng.zhao def name (name,add,age,phone=11111111111): print("你输入的名字为: %s,你的住址为: %s,你的年龄为%s, 你的手机号码为%s"%(name,add,age,phone)) name("赵文成","北京","26",22222222222) ##显示如下: 你输入的名字为: 赵文成,你的住址为: 北京,你的年龄为26, 你的手机号码为22222222222 Process finished with exit code 0
当默认参数在普通参数前时就会报错:
# -*- coding:utf-8 -*- # Author:wencheng.zhao def name (phone=11111111111 name,add,age,): print("你输入的名字为: %s,你的住址为: %s,你的年龄为%s, 你的手机号码为%s"%(name,add,age,phone)) name("赵文成","北京","26",22222222222) ##报错内容如下: File "D:/oldboy/projects/s13/day3/temp.py", line 3 def name (phone=11111111111 name,add,age,): ^ SyntaxError: invalid syntax Process finished with exit code 1
- 指定参数
指定参数其实就是在调用普通的参数时指定普通参数的值,如果指定值则调用时传递的参数顺序没有限制
# -*- coding:utf-8 -*- # Author:wencheng.zhao def name (name,add,age): print("你输入的名字为: %s,你的住址为: %s,你的年龄为%s"%(name,add,age)) name(age="26",add="北京",name="赵文成") ##显示如下 你输入的名字为: 赵文成,你的住址为: 北京,你的年龄为26 Process finished with exit code 0
- 动态参数1 一个星号 *
# -*- coding:utf-8 -*- # Author:wencheng.zhao def name(*args): print(args) name(1,2,3,4,5,6) ##显示如下: (1, 2, 3, 4, 5, 6) Process finished with exit code 0
调用时传递参数时*也会起到作用如下:
没有*好直接调用时则认为调用的为一个参数,带上*则会遍历所传的参数中的所有值(前提也是可迭代,字符串,列表 ,元组等)具体操作如下:
并且单个 * 默认放到元组中(双个星会默认放到字典中)
# -*- coding:utf-8 -*- # Author:wencheng.zhao def name(*args): print(args) li = [1,2,"ww",34,"(1,2,3)"] name(li) ##当调用没有*时则认为是一个元素,显示如下 ([1, 2, \'ww\', 34, \'(1,2,3)\'],) Process finished with exit code 0 #################################### #当调用时有星号时如下: # -*- coding:utf-8 -*- # Author:wencheng.zhao def name(*args): print(args) li = [1,2,"ww",34,"(1,2,3)"] name(*9月3日 文成小盆友python-num18 - django进阶一文成小盆友python-num7 -常用模块补充 ,python 牛逼的面相对象