Python基础(五)集合与函数
一、Set集合
set和dict类似,也是一组key的集合,但不存储value。由于key不能重复,所以,在set中,没有重复的key。下面一起看一下set的定义和使用方法:
(一),set定义
|
1
2
3
4
5
6
|
s1={11,22,33} #定义集合 s2=set([11,22,33,11,33]) #不能有重复key值 print(s1,s2) {33, 11, 22} {33, 11, 22} |
(二),set的方法
1,在集合中添加元素(add)
|
1
2
3
4
5
|
s1 = set([11,22,33]) s1.add(44) #添加元素 print(s1) {33, 11, 44, 22} |
2,clear、copy跟之前的类型一样,clear是清空集合中元素,copy是浅拷贝,不再举例说明
3, 判断A中存在B中不存在的方法(difference)
|
1
2
3
4
5
6
|
s1 = set([11,22,33]) s2 = set([22,33,44]) s3=s1.difference(s2) #判断S1中存在,S2中不存在的值赋值给S3 print(s3) {11} |
4,从当前集合中删除和B中相同的元素(difference_update)
|
1
2
3
4
5
6
|
s1 = set([11,22,33]) s2 = set([22,33,44]) s1.difference_update(s2) #删除S1中和S2中相同的元素 print(s1) {11} |
5,取A集合和B集合的交集( intersection )
|
1
2
3
4
5
6
7
8
|
s1 = set([11,22,33]) s2 = set([22,33,44]) s3=s1.intersection(s2) print(s3) {22,33}#取S1和S2的交集,交集也有update用法和ifference用法相同 |
6,判断A、B两个集合中有无交集,没有交集返回True,相反返回Fasle( isdisjoint )
|
1
2
3
4
5
6
|
s1 = set([11,22,33,]) s2 = set([22,33,44,]) s3=s1.isdisjoint(s2) #如果没有交集,返回True,相反返回False print(s3) Fasle |
7,移除集合中的元素,不存在不报错(discard)
|
1
2
3
4
5
6
|
s1 = set([11,22,33,44]) s1.discard(44) #移除指定元素,不存在不保错 s1.discard(55) print(s1) {33, 11, 22} |
8,随机删除集合中的元素(pop)
|
1
2
3
4
5
|
s1 = set([11,22,33,44,]) s1.pop() #pop随机删除,不建议使用 print(s1) {11, 44, 22} |
9,移除集合的元素,与discard不同的是,元素不存在会报错(remove)
|
1
2
3
4
5
|
s1 = set([11,22,33]) s1.remove(44) #推荐使用discard print(s1) KeyError: 44 |
10,取A中没有的和B中没有的,又叫对称差集。(symmetric_difference)
|
1
2
3
4
5
6
|
s1 = set([11,22,33,]) s2 = set([22,33,44,]) s3= s1.symmetric_difference(s2) #取对称差集赋值给S3 print(s3) {11,44} |
11,将A、B并在一起取它们的并集(union)
|
1
2
3
4
5
6
|
s1 = set([11,22,33,]) s2 = set([22,33,44,]) s3=s1.union(s2) #取并集 print(s3) {11,22,33,44} |
集合的方法介绍完毕,下面通过一个例子来应用一下set集合的方法:
大家都知道哦CMDB,下面有台服务器4个内存插槽,近期已更换内存,要将新更换的内存信息同步到CMDB里,具体更新信息如下:
|
1
2
3
4
5
6
7
8
9
10
|
old_mem={ '#1':8, '#2':4, '#4':2,} new_mem={ '#1':4, '#2':4, '#3':2,} |
操作步骤:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
old_set=set(old_mem.keys()) #将新旧字典的key转换成集合 new_set=set(new_mem.keys()) remove_set = old_set.difference(new_set) #找出要删除的信息 add_set = new_set.difference(old_set) #找出要添加的信息 update_set = new_set.intersection(old_set) #取两者交集进行更新 for i in remove_set: #通过循环的方式进行操作 del old_mem[i] #删除旧字典里的老数据 print(old_mem) for i in add_set: old_mem[i] = new_mem[i] #添加新数据到旧字典 print(old_mem) for i in update_set: old_mem[i] = new_mem[i] #旧字典重新赋值 print(old_mem) {'#2': 4, '#1': 8} {'#3': 2, '#2': 4, '#1': 8} {'#3': 2, '#2': 4, '#1': 4} |
二、python函数定义
(一),函数定义
首先我们来看定义函数要遵循的规则:
1,函数代码块以def关键词开头,后接函数标识名称和圆括号();
2,任何传入参数和自变量必须放在圆括号中间,圆括号之间可以用于定义参数;
3, 函数的第一行语句可以选择性地使用文档字符串,用于存放字符串;
4,函数内容以冒号起始,并且缩进
5,return[表达式]结束函数,选择性的返回一个值给调用方,不带表达式的return相当于返回None。
1,语法说明:
|
1
2
3
4
|
def functionname( parameters ): "函数使用说明" #在pycharm中输入"""回车"""自动生成说明模板 function_suite return [expression] |
2,函数调用
|
1
2
3
4
5
6
7
8
9
10
11
12
|
def printme(str): """ :param str: 打印任何传入的字符串 :return: None """ print(str) return# 调用函数printme("调用函数!")结果:调用函数! |
(二),函数的参数
函数参数的分类:
1、普通参数(严格按照顺序,将实际参数赋值给形式参数)
2、默认参数(必须放置在参数列表的最后)
3、指定参数(将实际参数赋值给制定的形式参数)
4、动态参数:
* 默认将传入的参数,全部放置在元组中, f1(*[1`1,22,33,44])
** 默认将传入的参数,全部放置在字典中 f1(**{"kl":"v1", "k2":"v2"})
5、万能参数, *args,**kwargs
下面逐个介绍函数参数的用法:
首先附上一个发邮件的函数,大家可以玩一玩:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
def sendmail(): import smtplib from email.mime.text import MIMEText from email.utils import formataddr msg = MIMEText('特斯拉已经到北京,请来4S店取货。', 'plain', 'utf-8') msg['From'] = formataddr(["", 'dihaifeng@126.com']) msg['To'] = formataddr(["走人", '123424324@qq.com']) msg['Subject'] = "主题" server = smtplib.SMTP("smtp.126.com", 25) server.login("dihaifeng@126.com", "sdfsadfsadffadf") server.sendmail('dihaifeng@126.com', ['123424324@qq.com', ], msg.as_string()) server.quit()sendmail() |
1、普通参数(位置参数)
|
1
2
3
4
5
6
7
8
9
10
11
|
def send(name,content,status): #括号里面的参数为形式参数 print(name,content,status) print('发送成功:',name,content) return Truewhile True: email = input('请输入邮箱地址:') result = send(email,"你好","OK") #调用函数传入的是实际参数,参数位置一一对应 if rsult == True: print('发送成功') else: print('发送失败') |
2、默认参数(缺省参数)
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
def send(name,content,status='Ok'): print(name,content,status) print('发送成功:',name,content,status) return Truewhile True: email= input('请输入邮箱地址:') send(email,'呵呵')结果:请输入邮箱地址:dihaifeng@126.comdihaifeng@126.com 你好 Ok发送成功: dihaifeng@126.com 你好 Ok #status为默认参数,在python中默认参数必须放置在参数列表的最后 |
3、指定参数
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
def send(name,content,status): print(name,content,status) print('发送成功:',name,content,status) return True #只要出现return,函数终止while True: email = input('请输入地址:') send(name=email,status='OK',content='你好') #可以指定形式参数的内容(无序的)结果:请输入地址:dihaifeng@126.comdihaifeng@126.com 你好 OK发送成功: dihaifeng@126.com 你好 OK |
4、动态参数(*)
|
1
2
3
4
5
6
7
8
9
10
11
|
def send(*args): #*号可以接受动态参数 print(args,type(args))li=[11,22,33,'hehe']send(li) #直接将列表看成一个元素写到元组中结果:([11, 22, 33, 'hehe'],) <class 'tuple'>send(*li) #传参的时候加*,代表将上面定义的元素循环写入args元组里结果: (11, 22, 33, 'hehe') <class 'tuple'> |
上面有一个问题就是能不能传入字符串,答案是可以的,参数为字符串是,安装字符循环写到元组里。
5、动态参数(**)默认将传入的参数,全部放置在字典中
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
def f1(**args): print(args,type(args))方法1: f1(k1='v1',k2='v2') 结果:{'k1': 'v1', 'k2': 'v2'} <class 'dict'> 方法2: dic={'k1':'v1','k2':'v2'} f1(kk=dic) 结果:{'kk': {'k1': 'v1', 'k2': 'v2'}} <class 'dict'>方法3: f1(**dic) 结果:{'k1': 'v1', 'k2': 'v2'} <class 'dict'> |
6、万能参数(*args,**kwargs)既可以接收字符串,列表元组也可以接收字典等特殊类型。
|
1
2
3
4
5
6
|
def f1(*args,**kwargs): print(args,kwargs)f1(1,2,3,4,k1='v1',k2='v2')结果:(1, 2, 3, 4) {'k2': 'v2', 'k1': 'v1'} |
(三),函数的特性
函数的特性:
1、根据python代码从上问下的执行顺序,下面的代码第一个f1()函数为无效函数,python会当作垃圾内存就行处理。
|
1
2
3
4
5
6
7
8
|
def f1(a1,a2): return a1 + a2def f1(a1,a2): return a1 * a2ret = f1(8,8)print(ret)64 |
2、Python中传递参数为引用,而不是在内存中申请新的内存
|
1
2
3
4
5
6
7
|
def f1(a1): a1.append(999)li= [11,22,33,44]f1(li)print(li)[11, 22, 33, 44, 999] |
3、全局变量
|
1
2
3
4
5
6
7
8
9
10
11
12
|
NAME=[11,22,33,44] #定义全局变量时字母全部大写def f1(): age=18 #全局变量,所有作用域都可读 global NAME #在函数中修改全局变量时,必须声明global就行修改 NAME=[5] print(age,NAME)def f2(): age=19 print(age,NAME)f1()f2() |
4、lambda: 简单的函数可以使用lambda表达式进行定义,a1,a2为形式参数,可以传入多个数
|
1
2
3
4
5
6
7
8
9
10
11
12
|
def f1(a1): return a1 + 100ret = f1(10)print(ret)f2= lambda a1,a2: a1 + 100r2 = f2(102,20)print(r2)结果:110202 |
下面举两个例子来巩固一下刚才的函数的内容:
1,字符串格式化format()
|
1
2
3
4
5
6
7
8
9
|
#帮助信息 def format(self, *args, **kwargs): # known special case of str.format """ S.format(*args, **kwargs) -> str Return a formatted version of S, using substitutions from args and kwargs. The substitutions are identified by braces ('{' and '}'). """ pass |
|
1
2
3
4
5
6
7
8
9
|
s1 = 'I am {0}, age {1}'.format('alex',18) #传入字符串print(s1)s2 = 'I am {0} age {1}'.format(*['alex',18]) #传入列表print(s2)s1 = 'I am {name}, age {age}'.format(name='alex',age=18) #传入字典print(s1)dic={'name':'alex','age':18}s2 = 'I am {name}, age {age}'.format(**dic)print(s2) |
2、一个登录的小程序
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
def login(username,password): """ 定义登录函数 :param username:记录用户传入的user :param password:记录用户传入的passwd :return: 返回值 """ f = open('user','r') for line in f: line_list=line.split('|') if line_list[0] == username and line_list[1] == password: return True return Falsedef register(username,password): """ :param username: :param password: :return: """ f= open('user','a') temp = '\n' + username + '|' + password f.write(temp) f.close()def main(): t = input('1:登录,2:注册').strip() if t == '1': user=input('请输入用户名:') passwd=input('请输入密码:') r = login(user,passwd) if r: print('登录成功') else: print('登录失败') elif t == '2': user=input('请输入用户名:') passwd = input('请输入密码:') ret= register(user,passwd)main() |
Python基础(五)集合与函数的更多相关文章
- 十五. Python基础(15)--内置函数-1
十五. Python基础(15)--内置函数-1 1 ● eval(), exec(), compile() 执行字符串数据类型的python代码 检测#import os 'import' in c ...
- 十六. Python基础(16)--内置函数-2
十六. Python基础(16)--内置函数-2 1 ● 内置函数format() Convert a value to a "formatted" representation. ...
- python基础数据类型--集合(set)
python基础数据类型--集合(set) 集合是一个数学概念由一个或多个确定的元素所构成的整体叫做集合 集合中的三个特征 1.确定性(元素必须死可hash) 2.互异性(去重) 3.无序性(集合中的 ...
- Python进阶(五)----内置函数Ⅱ 和 闭包
Python进阶(五)----内置函数Ⅱ 和 闭包 一丶内置函数Ⅱ ####内置函数#### 特别重要,反复练习 ###print() 打印输入 #sep 设定分隔符 # end 默认是换行可以打印到 ...
- python基础五(函数、全局变量和局部变量)
一.全局变量和局部变量 全局变量,即可以在当前文件所有地方都可使用的变量,一次修改,整个文件都影响.如果函数体内部使用全局变量,要先声明global 局部变量,只能在函数体内部使用,除了函数体就不可使 ...
- Python基础篇(三)_函数及代码复用
Python基础篇_函数及代码复用 函数的定义.使用: 函数的定义:通过保留字def实现. 定义形式:def <函数名>(<参数列表>): <函数体> return ...
- python基础学习1-内置函数
#!/usr/bin/env python # -*- coding:utf-8 -*- 系统内置函数 n =abs(-1) #绝对值 print(n) #bytes()函数 s="离开&q ...
- 流畅的python第五章一等函数学习记录
在python中,函数是一等对象,一等对象是满足以下条件的程序实体 1在运行时创建 2能复制给变量或数据结构的元素 3能作为参数传给函数 4能作为函数的返回结果 高阶函数(接受函数作为参数或者把函数作 ...
- Python基础知识之5——函数基础
函数 函数是一个独立且封闭完成特定功能的代码块,可以在任何地方被调用.Python内置了很多函数,我们可以直接调用,使用的时候,先查询下Python的官方文档即可: http://docs.pytho ...
- Python基础-week03 集合 , 文件操作 和 函数详解
一.集合及其运算 1.集合的概念 集合是一个无序的,不重复的数据组合,它的主要作用如下 *去重,把一个列表变成集合,就自动去重了 *关系测试,测试两组数据之前的交集.并集.差集.子集.父级.对称差集, ...
随机推荐
- Spark 分布式环境---slave节点无法启动(已解决)
soyo@soyo-VPCCB3S1C:~$ start-slaves.sh soyo-slave01: starting org.apache.spark.deploy.worker.Worker, ...
- C++中正确使用PRId64 (转载)
转自:http://blog.csdn.net/win_lin/article/details/7912693 例子参考高性能流媒体服务器SRS:https://github.com/winlinvi ...
- log4j日志基本配置
Log4j有三个主要的组件:Loggers(记录器),Appenders (输出源)和Layouts(布局).这里可简单理解为日志类别,日志要输出的地方和日志以何种形式输出.综合使用这三个组件可以轻松 ...
- 在visual studio code和visual studio中编写TypeScript文件自动生成JavaScript文件
注:此处的自动生成都为保存ts文件时自动生成js文件 VS CODE 只需要在TypeScript的终端控制台中输入如下命令即可,并注意需要将其中的*换成对应的文件名,此处的*似乎不能作为通用匹配. ...
- tyvj 2054 [Nescafé29]四叶草魔杖【克鲁斯卡尔+状压dp】
传送:http://www.joyoi.cn/problem/tyvj-2054 来自lyd课件: 所以先预处理出各个sum为0的块,然后状压dfs取min来得到答案 #include<iost ...
- layui 动态左树导航栏显示样式BUG规避
先看问题现象: 使用 layui 的左树功能,先在html页面添加左树功能引入 <ul class="layui-nav layui-nav-tree layui-nav-side&q ...
- 创建 pulic dblink 使不同的用户可以访问dblink
1. system: grant create public database link to ivrsdata; 2.userdate: tnsnames.ora config db connect ...
- 387 First Unique Character in a String 字符串中的第一个唯一字符
给定一个字符串,找到它的第一个不重复的字符,并返回它的索引.如果不存在,则返回 -1.案例:s = "leetcode"返回 0.s = "loveleetcode&qu ...
- D. Fedor and coupons 二分暴力
http://codeforces.com/contest/754/problem/D 给出n条线段,选出k条,使得他们的公共部分长度最大. 公共部分的长度,可以二分出来,为val.那么怎么判断有k条 ...
- kill 8080 port on windows
1. 查找PID netstat -ano | findstr :yourPortNumber 2. kill进程 taskkill /PID typeyourPIDhere /F