一、set

1. set集合,无序、不重复的元素集合

# 创建set集合
s1 = {11, 22, 33}
print(s1,type(s1))
==> {33, 11, 22} <class 'set'>l1 = [2, 3, 4,]
s1 = set(l1)
print(l1,type(l1))
==> [2, 3, 4] <class 'list'>print(s1,type(s1))
==> {2, 3, 4} <class 'set'># 集合中增加元素
s1 = {11, 22, 33}
s1.add(44)
print(s1)
==> {33, 11, 44, 22}# 清空集合中元素
s1 = {11, 22, 33}
print(s1)
==> {33, 11, 22}s1.clear()
print(s1)
==> set()# 找到在s1中有,s2中没有的元素,并保存到一个新的集合
s1 = {11,22,33,}
s2 = {22,33,44,}
s3 = s1.difference(s2)
print("%s \n%s \n%s" % (s1,s2,s3))
==> {33, 11, 22}
==> {33, 44, 22}
==> {11}# 找到在s1中有,s2中没有的元素,把结果更新到s1中
s1 = {11,22,33,}
s2 = {22,33,44,}
s1.difference_update(s2)
print("%s \n%s" % (s1,s2))
==> {11}
==> {33, 44, 22}# 找到即在集合s1中,又在集合s2中的元素,并把结果保存到一个新的集合里
s1 = {11,22,33,}
s2 = {22,33,44,}
s3 = s1.intersection(s2)
print("%s \n%s \n%s" % (s1,s2,s3))
==> {33, 11, 22}
==> {33, 44, 22}
==> {33, 22}# 找到即在集合s1中,又在集合s2中的元素,并把结果更新到s1中
s1 = {11,22,33,}
s2 = {22,33,44,}
s1.intersection_update(s2)
print("%s \n%s" % (s1,s2))
==> {33, 22}
==> {33, 44, 22}# 判断两个集合是否有交集,没有交集时返回True,有交集时返回False
s1 = {11,22,33,}
s2 = {22,33,44,}
s3 = {1,2,3,}
s1.isdisjoint(s2)
==> False
s1.isdisjoint(s3)
==> True# 判断s1是不是s2的子集
s1 = {11,22,}
s2 = {11,22,33,44,}
s3 = {22,33,}
s1.issubset(s2)
==> Trues1.issubset(s3)
==> False# 判断s1是不是s2的父集
s1 = {11,22,33,44,55}
s1 = {11,22,33,44,55,}
s2 = {22,33,55,}
s3 = {44,33,66,}
s1.issuperset(s2)
==> Trues1.issuperset(s3)
==> False# 任意删除并返回一个元素
s1 = {11,22,33,44,55,}
s1.pop()
==> 33# 删除指定的一个元素,这个元素必须在集合中,否则报错。区别于discard()
s1 = {11,22,33,}
s1.remove(11)
print(s1)
==> {33, 22}s1.remove(44)
==> Traceback (most recent call last):File "<stdin>", line 1, in <module>KeyError: 44# 删除指定的一个元素,如果元素不存在不报错。可以起到判断元素是否在集合中时,代码不报错的作用
s1 = {11,22,33,}
s1.discard(11)
print(s1)
==> {33, 22}s1.discard(44)   # 44 不在s1中,操作时不报错
print(s1)
==> {33, 22}# 相当于取两个集合的并集,再把他俩的交集删掉。返回这个新集合
s1 = {11,22,33,44,}
s2 = {22,44,55,66}
s3 = s1.symmetric_difference(s2)
print("%s \n%s \n%s" % (s1,s2,s3))
==> {33, 11, 44, 22}
==> {66, 44, 22, 55}
==> {33, 66, 11, 55}# 取s1,s2两个集合的并集,再把他俩的交集删掉。结果赋值给s1
s1 = {11,22,33,44,}
s2 = {22,44,55,66}
s1.symmetric_difference_update(s2)
print("%s \n%s" % (s1,s2))
==> {33, 66, 11, 55}
==> {66, 44, 22, 55}# 取两个集合的并集,结果返回到一个新集合中
s1 = {11,22,33,44,}
s2 = {22,44,55,66}
s3 = s1.union(s2)
print("%s \n%s \n%s" % (s1,s2,s3))
==> {33, 11, 44, 22}
==> {66, 44, 22, 55}
==> {33, 66, 11, 44, 22, 55}# s1.update(s2) 去两个集合的并集,将结果赋值给s1
s1 = {11,22,33,44,}
s2 = {22,44,55,66}
s1.update(s2)
print("%s \n%s" % (s1,s2))
==> {33, 66, 11, 44, 22, 55}
==> {66, 44, 22, 55}

2. set需求练习

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author He Xu

old_dict = {"#1":8,"#2":4,"#4":2,
}new_dict = {"#1":4,"#2":4,"#3":2,
}# 需求:将插槽4的内存放到插槽3,将插槽1的内存改为4G# 因为是字典
new_set = set(new_dict.keys())
old_set = set(old_dict.keys())# 应该删除槽位4: old存在,new不存在的key
remove_set = old_set.difference(new_set)
print(remove_set)
==> {'#4'}# 应该增加槽位3: new存在,old不存在的
add_set = new_set.difference(old_set)
print(add_set)
==> {'#3'}# 应该更新槽位1: 两个都有的,取交集
update_set = old_set.intersection(new_set)
print(update_set)
==> {'#2', '#1'}

二、 函数

1. 函数类型:自定义函数、内置函数

2. 特性:面向过程编程,往往是有重复性的复制、粘贴动作,这样会造成代码庞大,可读性差。而面向函数式编程,可以增加代码的重用性。

3. 函数格式

1. def关键字,代表创建函数2. 函数名3. ()  # 参数   #可加形式参数,等于就是一个变量,后面具体传的值叫实际参数;形式参数可加多个,对应的实际参数也要按顺序一一对应   #普通参数,按顺序传参   #默认参数,必须放到参数列表的末尾   #指定参数,不用按顺序了   #  * ,可以接收n个实际参数,默认将传入的参数,全部放在元组中   #  ** ,可以接收n个实际参数,默认将传入的参数,全部放在字典中   # 万能参数,*在前,**在后4. 函数体:是不被执行的,调用的时候才执行5. 返回值6. 执行函数

注意:在函数中,一旦出现return,不会再执行后面的代码如果没定义return,python会自动return成'None'

4. 邮件发送函数代码(示例)

def sendmail():try:import smtplibfrom email.mime.text import MIMETextfrom email.utils import formataddrmsg = 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", "WW.3945.59")server.sendmail('wptawy@126.com', ['664076968@qq.com', ], msg.as_string())server.quit()except:# 发送失败传给sendmail()return  False # return值可以是字符串else:# 发送成功传给sendmail()return True   # return值可以是字符串

ret = sendmail()
print(ret)
# 后面还可以加if判断

5. 函数中的参数

# 普通参数,按顺序传参
def send(name,age):print(name,age)return Truesend('hexu',28)==> hexu 28# 默认参数
def send(name,age,content='is a person'):print(name,age,content)return Truesend('Hexu',28)  # 默认参数:如果没指定参数,就会把默认参数打出来
send('Xuelu',26,"is a god") # 指定一个参数,就会打指定的参数==> Hexu 28 is a person
==> Xuelu 26 is a god# 指定参数:将实际参数复制给指定的形式参数
def send(name,age):print(name,age)return Truesend(age=28,name='hexu')==> hexu 28# 带*的,可以接收动态参数
def f1(*args):print(args,type(args))f1(11)  # 一个参数
f1(11,22,'hexu')  # 多个参数
f1([11,22,'hexu'],'liuwei') # 参数也可以是列表
f1(*['aa','bb',28]) # 实际参数前面带*,会将列表中的每一个元素当做元组中的一个元素
f1(*'hexu')  # 实际参数前面带*,会将字符串中的每一个元素当做元组中的一个元素==> (11,) <class 'tuple'>
==> (11, 22, 'hexu') <class 'tuple'>
==> ([11, 22, 'hexu'], 'liuwei') <class 'tuple'>
==> ('aa', 'bb', 28) <class 'tuple'>
==> ('h', 'e', 'x', 'u') <class 'tuple'># 带两个*的,生成的是字典
def f1(**args):print(args,type(args))f1(n1="hexu",n2=28) # 这种键值的组合,会自动生成字典

dic = {'k1':'v1','k2':'v2'}f1(kk=dic) # kk是key,dic是value
f1(**dic)==> {'n2': 28, 'n1': 'hexu'} <class 'dict'>
==> {'kk': {'k2': 'v2', 'k1': 'v1'}} <class 'dict'>
==> {'k2': 'v2', 'k1': 'v1'} <class 'dict'># 万能参数
def f1(*args,**kwargs):print(args)print(kwargs)
f1(11,22,33,k1='hexu',k2='liuwei')==> (11, 22, 33)
==> {'k2': 'liuwei', 'k1': 'hexu'}# 引出字符串的格式化
s1 = 'i am {0},age {1}'.format('hexu',28)
print(s1)
s2 = 'i am {0},age {1}'.format(*['hexu',28])
print(s2)==> i am hexu,age 28
==> i am hexu,age 28# 必须指定
s3 = 'i am {name},age {age}'.format(name='hexu',age=28)
print(s3)
dic = {'name':'hexu','age':28}
s4 = 'i am {name},age {age}'.format(**dic)
print(s4)==> i am hexu,age 28
==> i am hexu,age 28

7. 全局变量

# 函数执行顺序,自上到下,按最新的函数显示执行结果
def f1(a1,a2):return a1 + a2def f1(a1,a2):return a1 * a2ret = f1(8,8)
print(ret)==> 64# 函数传参,传递的是引用,不是再复制一份
def f1(a1):a1.append(999)li = [1,2,3,4,]  # li是全局变量,从这个例子中可以看出,函数的局部作用域可以对全局变量的进行修改。
f1(li)
print(li) # 最终li中增加了999这个元素# 定义全局变量,要大写!
NAME = 'hexu'def f1():age = 20print(age,NAME)  # 引用全局变量NAMEdef f2():age = 18global NAME    # 修改全局变量要用globalNAME = 'liuwei' # 重新赋值print(age,NAME)f1()
f2()==> 20 hexu
==> 18 liuwei# 特殊情况:不用global的情况下: 列表字典,可修改,不可赋值
LI = [1,2]def f1():LI.append(3)
f1()
print(LI)def f2():LI = [4,5]
f2()
print(LI)==> [1, 2, 3]
==> [1, 2, 3]

8. 内置函数

# abs() 绝对值
n = -1
print(abs(n))==> 1# 0,None,'',[],{}
# all() 一个为假,就为假
n = all([1,2,3,None])
print(n)==> Flase# any() 一个为真,就为真
n = any([[],0,'',6])
print(n)==> True# bin()十进制转换为二进制  0b
print(bin(5))
==> 0b101# oct() 十进制转换为八进制 0o
print(oct(9))
==>0o11# hex() 十进制转换为十六进制 0x
print(hex(15))
==> 0xf# ut8-f 一个汉字是3个字节
# gbk 一个汉字是2个字节
# 字符串转换成字节
# bytes()  只能转换字符换,按照什么编码,默认转换成16进制,非常重要!!
n = bytes('贺旭',encoding='utf-8')
print(n)
==> b'\xe8\xb4\xba\xe6\x97\xad'n = bytes('贺旭',encoding='gbk')
print(n)
==> b'\xba\xd8\xd0\xf1'# 字节转换成字符串,编码一定要一致
n = str(bytes('贺旭',encoding='utf-8'),encoding='utf-8')
print(n)
==> 贺旭

9. 内置函数中的open文件操作

# db文件原始内容如下
hexu|123
liuwei|999# 以只读形式打开文件
with open('db','r') as fp:data = fp.read()print(data, type(data))输出:
hexu|123
liuwei|999 <class 'str'># 追加到文件的最后,加b是字节,没有b是字符串
with open('db','ab') as fp:data = fp.write(bytes('刘伟',encoding='utf-8'))print(data)输出:
hexu|123
liuwei|999刘伟# r+ 配合seek使用
f = open('db','r+',encoding='utf-8') # 如果没有b,则read,按照字符读取;如果有b,按照字节读取
data = f.read(1)
print(data)
==> 1print(f.tell())  # 找到当前指针所在位置 (字节)
f.seek(f.tell())  # 指针跳转到指针位置(字节)
f.write('88')  # 当前指针位置开始向后覆盖
f.close()输出:
h88u|123
liuwei|999# 同时打开多个文件
with open("db", "r") as file01, open("db.bak", "x") as file02:for i in file01: # 读取db文件的每一行,写入到db.bak文件,如果db.bak文件存在,报错,不做操作
        file02.write(i)with open("db.bak", "r") as f:res = f.read()print(res)

10. 利用函数做一个用户登录程序

# db原始文件内容
hexu|123
liuwei|999def login(username,password):'''用于用户登录:param username: 用户输入的用户名:param password: 用户输入的密码:return: True,表示登录成功;False,表示登录失败'''with open('db','r') as fp:for line in fp:line_list = line.strip().split('|')if line_list[0] == username and line_list[1] == password:return Truereturn Falsedef register(username,password):'''用于用户注册,注意判断输入的用户名是否在db里已经有了:param username: 用户输入的用户名:param password: 用户输入的密码:return: 默认None'''with open('db','a') as fp:tmp = '\n' + username + '|' + passwordfp.write(tmp)def main():choose = input('1:登录  2:注册')if choose == '1': # 这里的1是字符串user = input('请输入用户名:')pwd = input('请输入密码:')r = login(user,pwd)  # 引用login函数,将用户输入的用户名、密码传进去if r:print('登录成功')else:print('登录失败')elif choose == '2':user = input('请输入用户名:')pwd = input('请输入密码:')register(user,pwd)main()

三、三元运算

# 传统模式
a = input("请输入1")
if a == "1":name = "hexu"
else:name = "liuwei"
print(name)# 三元运算 对if else 的简写
a = input("请输入1")
name = "hexu" if a == "1" else "liuwei"
print(name)

四、lambda表达式

# 传统方式
def f1(a1):return a1 + 100
ret = f1(10)
print(ret)
==> 110f2 = lambda a1,a2:a1 + a2 + 100 # 冒号前面的是参数
ret1 = f2(10,20)
print(ret1)
==> 130

转载于:https://www.cnblogs.com/begin00/p/5535518.html

【python-Day3】相关推荐

  1. 【python技巧】“”、“”等符号操作

    [python技巧] 1)[关于'&' :按照二进制进行与操作,可以用作判断奇偶][https://zhidao.baidu.com/question/308587899.html] & ...

  2. 【python初识】数据和对象

    [python初识]数据和对象 1.迭代和循环 for t in na.append(fun(t))a = [fun(t) for t in n] 2.set函数 创建集合(没有重复的元素) 3.so ...

  3. 【python图像处理】】python绘制散点图

    python中用于绘图是matplotlib模块中的pyplot类,直接使用plot()函数绘制出的是折线图.而绘制散点图使用的是scatter()函数. 直接看下面的代码 #-*- coding: ...

  4. 【Python进阶】带你使用Matplotlib进行可视化

    欢迎来到专栏<Python进阶>.在这个专栏中,我们会讲述Python的各种进阶操作,包括Python对文件.数据的处理,Python各种好用的库如NumPy.Scipy.Matplotl ...

  5. 【Python进阶】你真的明白NumPy中的ndarray吗?

    欢迎来到专栏<Python进阶>.在这个专栏中,我们会讲述Python的各种进阶操作,包括Python对文件.数据的处理,Python各种好用的库如NumPy.Scipy.Matplotl ...

  6. 【Python进阶】实战Python图形文件操作基本编程

    欢迎来到专栏<Python进阶>.在这个专栏中,我们会讲述Python的各种进阶操作,包括Python对文件.数据的处理,Python各种好用的库如NumPy.Scipy.Matplotl ...

  7. 【Python进阶】Python进阶专栏栏主自述:不忘初心,砥砺前行

    转眼间加入有三AI快半年了,今天给大家来个自我介绍,分享下这一路来的历程与未来的规划. 作者 | 汤兴旺 编辑 | 汤兴旺 不忘初心 不知道为啥,从小自己对IT有着莫名的兴趣,但由于自己的近视度数太高 ...

  8. 【Python进阶】实战Python面向对象基本编程

    欢迎来到专栏<Python进阶>.在这个专栏中,我们会讲述Python的各种进阶操作,包括Python对文件.数据的处理,Python各种好用的库如NumPy.Scipy.Matplotl ...

  9. 人脸识别python face_recognize_【python+face_recognition】人脸识别初始

    [python+face_recognition]人脸识别初始 发布时间:2018-09-01 12:03, 浏览次数:366 , 标签: python face recognition face_r ...

  10. 将python3.7降为3.5_python3.7降至3.5【python cookbook】python访问子字符串

    访问子字符串最简单的的方式是使用切片 afiled=theline[3:8]但一次只能取一个子字符串 如果还要考虑字段的长度struct.unpack可能更合适 importstruct #得到一个5 ...

最新文章

  1. 1196: 数星星(二)(结构体专题)_福利:最新导数6大专题!高分段提分有困扰?听北大状元漫谈提分...
  2. 1.5s~0.02s,期间我们可以做些什么?
  3. 介绍一下你对浏览器内核的理解?
  4. python螺旋打印二维数组_Python使用迭代器打印螺旋矩阵的思路及代码示例
  5. 加州圣地亚哥电子和计算机工程研究生申请入口
  6. 绝望的力量:美术创作者的晋级之路
  7. (力扣)中心扩散法求最长回文子串
  8. 三、bootstrap4 组件(警告和提示框、徽章和面包屑、按钮按钮组、卡片、列表组、导航和选项卡、分页和进度条、巨幕和旋转图标、轮播图、折叠菜单、下拉菜单、导航条、滚动监听、轻量弹框、模态框、表单)
  9. 移位运算与除法、取模运算
  10. Atitit. 二进制数据ascii表示法,与base64编码解码api 设计标准化总结java php c#.net...
  11. 《可信计算的研究与发展》;C-Rank:一种Deep Web数据记录可信度评估方法
  12. oracle startup open ora 03113,解决oracle数据库ORA-03113问题
  13. 【redis客户端登录】
  14. 复制csdn或者博客园文章时,图片无法直接粘贴过来解决办法
  15. meltdown linux检测,Spectre ampamp; Meltdown漏洞检测工具
  16. 初几学的计算机二进制,说说二进制与计算机的那些事儿
  17. pycharm中Crtl+Shift+F10快捷键问题
  18. 安全设计:加速传输软件镭速传输安全技术解读
  19. 仅限中国:AMD推出Radeon RX 560 XT
  20. 【MySQL】连接查询

热门文章

  1. 仅5天注册用户超百万,爆火ChatGPT究竟是什么?
  2. C++(Qt)软件调试---linux下生成/调试Core文件(3)
  3. 梯度提升树GBDT的理论学习与细节补充
  4. 由宏观到细节谈谈BP神经网络搭建
  5. iphone push消息的原理
  6. ios uri正则表达式_正确匹配URL的正则表达式
  7. 熊岳白沙湾海边看日出
  8. 同步类容器和并发类容器
  9. 仿新浪微博IOS客户端(v5.2.8)——搭建项目基本框架
  10. windows系统下递归遍历目录下的所有文件