Day3 set集合、函数和装饰器
set特性:无序,不重复,可嵌套
创建set
set_example = set("123", "213", "234", "432")
s1 = [11,22,33,44,11,22,33]
s2 = set(s1)
print(s2)
list()相当于执行构造方法__int__,内部会执行一个for循环,循环(11,22,33,44,11,22,33)set差异
s1 = {11, 33, 44, 66}
s2 = {22, 33, 44 ,55, 88}
s1中存在s2中不存在
s3 = s1.difference(s2)
print(s3)
差异结果更新到s1中
s1.difference_update(s2)
print(s1)
s1.symmetric_difference_update(s2)print(s1)
移除指定元素,存在移除,不存在不做任何操作,discard最有用
s1.discard(11)
print(s1)
移除指定元素,不存在报错
s1.remove(11111)
随机移除
s1 = {11, 33, 44, 66}
s3 = s1.pop()
print(s1)
print(s3)
交集
s3 = s1.intersection(s2)
print(s3)
交集更新到s1
s1.intersection_update(s2)
print(s1)
是否父子序列
s1.issubset(s2)
s1.issuperset(s2)
并集
s3 = s1.union(s2)
print(s3)
循环更新(字符串、列表、元组)即可以for循环的对象
s1.update([11,22,33,44,55,66,77,88,99,00])
print(s1)
set练习题
old_dict = {
"#1": 8,
"#2": 4,
"#4": 2,
}
new_dict = {
"#1": 4,
"#2": 4,
"#3": 2,
}
#应该删除哪几个槽位
old_set = set(old_dict.keys())
new_set = set(new_dict.keys())
old_set.difference()
#需要删除的,old中有new中没有
remove_set = old_set.difference(new_set)
print("需要删除的槽位:%s" % remove_set)
#需要增加的,new中有old没有
add_set = new_set.difference(old_set)
print("需要增加的槽位:%s" % add_set)
#需要更新的,old和new的交集
update_set = old_set.intersection(new_set)
print("需要更新的槽位:%s" % update_set)
函数定义
1.def关键字创建函数
2.函数名
3.()
4.函数体
5.返回值
6.参数
发送邮件例子:
def sendmail():
import smtplib
from email.mime.text import MIMEText
from email.utils import formataddr#捕捉异常
try:
msg = MIMEText('邮件内容', 'plain', 'utf-8')
msg['From'] = formataddr(["张三",'zhangsan@163.com'])
msg['To'] = formataddr(["Python发送邮件",'lisi@163.com'])
msg['Subject'] = "Python发送邮件" #开启smtp服务,并输入用户名、密码
server = smtplib.SMTP("smtp.163.com", 25)
server.login("zhangsan@163.com", "123456")
server.sendmail('zhangsan@163.com', ['lisi@163.com',], msg.as_string())
server.quit()
except:
#发送失败
return False
else:
#发送成功
return True
#return cc
ret = sendmail()
print(ret)
if ret == True: #也可以判断cc
print("邮件发送成功!")
else:
print("邮件发送失败!")
在函数中只要执行return,后续的代码都不会执行
def f1():
print(123)
return "111"
print(234)
r = f1()
print(r)
如果没有return会默认返回一个值None
def f2():
print(12345)
r2 = f2()
print(r2)
函数中的参数
1、普通参数(严格按照 顺序,将实际参数赋值给形式参数)
2、默认参数(必须放置在参数列表的最后)
3、指定参数(将实际参数赋值给指定的形式参数)
4、动态参数(*args、**kwargs)
5、万能参数(*args,**kwargs)
#形式参数:em
def sendmail(em):...while True:
#实际参数:email_addr
email_addr = input("请输入邮箱地址:")
result = sendmail(email_addr)
if result == True: # 也可以判断cc
print("邮件发送成功!")
else:
print("邮件发送失败!")
python规定:如果对某个参数默认值(mm = "OK"),必须将其放到末尾
def sendmail(email_addr, content, mm = "OK"):...while True:
#实际参数
email_addr = input("请输入邮箱地址:") #指定参数:content ='haha'
result = sendmail(content ='haha', email_addr)
if result == True: # 也可以判断cc
print("邮件发送成功!")
else:
print("邮件发送失败!")
*参数,可以传递多个值,类型为tuple
把列表当成一个元素传递
def f1(*args):
print(args,type(args)) f1(11,22,33,'aa','ff')
如果传递参数时带*,则把列表中的每一个元素转化到元组中;其实就是在内部做了for循环将参数中的每一个值存放到元组中
def f1(*args):
print(args,type(args)) #f1(11,22,33,'aa','ff')
l1 = [11,22,33,'aa','ff']
f1(*l1)
传递**,则把传递的参数存放到字典中,所以需要指定key和value
def f1(**args):
print(args,type(args)) #f1(11,22,33,'aa','ff')
l1 = [11,22,33,'aa','ff']
f1(n1 = l1)
传递字典加*,需要指定key
def f1(**args):
print(args,type(args))
dic = {'k1':'v1','k2':'v2'}
f1(ni = dic)
传递字典加**
def f1(**args):
print(args,type(args))
dic = {'k1':'v1','k2':'v2'}
f1(**dic)
总结:加*默认将传入的参数放入元组中,加**默认将传入的参数放入字典中。
万能参数(*args, **kwargs)顺序固定
def f1(*args, **kwargs):
print(args,type(args))
print(kwargs, type(kwargs)) f1(11,22,33,44,'aa',k1='v1',k2='v2')
利用参数格式化输出
s = "I am {0} , age is {1}".format('wang',20)
s1 = "I am {0} , age is {1}".format(*['wang',20])
s3 = "I am {name} , age is {age}".format(name='wang',age=20)
dic = {'name':'wang','age':20}
s4 = "I am {name} , age is {age}".format(**dic)
创建两个相同函数,以后面创建的函数为准,前面创建的废弃
def f1(a1, a2):
return a1 + a2 def f1(a1, a2):
return a1 * a2 ret = f1(8, 8)
print(ret) #64
函数的参数在传递时是引用还是值?答案是引用。
def f2(a3):
a3.append(999)
li = [11,22,33,44]
f2(li)
print(li) #[11, 22, 33, 44, 999]
全局变量
1、所有的作用域里都可读;
2、优先使用自己定义的变量;
3、global name3进行重新赋值;
4、特殊:列表和字典,可修改不可重新赋值;
5、全局变量一定要全部大写。
NAME3 = "alex"
def f3():
global NAME3
NAME3 = "wang"
print(NAME3)
def f4():
print(NAME3)
f3()
f4() NAME4 = [11,22,33,44,55]
def f5():
print(NAME4)
NAME4.append(66)
def f6():
print(NAME4) f5()
f6()
函数实现登录注册
def login(username, password):
"""
用于用户登录
:param username:用户名
:param password:用户输入的密码
:return True:登录成功,False:登录失败
"""
f = open("db", "r")
for line in f:
line_list = line.strip().split("|")
if line_list[0] == username and line_list[1] == password:
return True
return False def register(username, password):
"""
用户注册
:param username:用户名
:param password:密码
"""
# 追加模式
f = open("db", "a")
temp = "\n" + username + "|" + password
f.write(temp)
f.close() def main():
t = input("1:登录: 2:注册")
if t == "1":
user = input("请输入用户名:")
pwd = input("请输入密码:")
r = login(user, pwd)
if r:
print("登录成功!")
else:
print("登录失败!")
elif t == "2":
user = input("请输入用户名:")
pwd = input("请输入密码:")
register(user, pwd) main()
三元运算,三目运算
如果 1 == 1 成立,name = "wang";否则name = "radar"
name = "wang" if 1 == 1 else "radar"
简单的函数可以使用lambda表达式
def f1(a1):
return a1 + 100
ret1 = f1(10)
print(ret1) #定义函数f2,冒号前面的为参数,冒号后面为表达式,隐含return功能,只能写一行,会返回结果
f2 = lambda a1, a2: a1 + 100 + a2
ret2 = f2(9,10)
print(ret2)
内置函数

1、取绝对值abs
n = abs(-1001)
print(n)
2、all,any
0,None,空字符串,空列表,空字典,空元组,bool值都是False
print(bool(0))
all中所有为真才为真
n = all([1,2,3,0])
print(n)
any中只要有真就为真
n = any([0,1,0,0,0])
print(n)
3、ascii()自动执行对象的__repr__方法
class Foo:
def __repr__(self):
return "65"
n = ascii(Foo())
print(n)
4、进制转换
#bin() 二进制
print(bin(23))
#oct() 八进制
print(oct(345))
#hex() 十六进制
print(hex(1111111))
5、字符串转字节bytes()
bytes(待转换的字符串, 按照什么编码)
汉字utf-8编码3个字节,GBK一个汉字两个字节,一个字节8位
#utf-8s = "二万画画"
# 01000110 01000110 01000110 01000110 01000110 01000110 01000110 01000110 01000110 01000110 01000110 01000110#十进制表示# 43 43 43 43 43 43 43 43 43 43 43 43
m = bytes(s, encoding="utf-8")
m1 = bytes(s, encoding="GBK")
print(m)
print(m1)
6、字符串转换为字节列表bytearray()
m2 = bytearray(s, encoding="utf-8")
print(m2)#字节转换为字符串,编码方式保持一致
m3 = str(m2,encoding="utf-8")
print(m3)
7、文件操作open
#打开文件
f = open('db','r') #只读
f = open('db','w') #只写,写之前清空文件
f = open('db','x') #文件存在就报错;不存在创建并只写
f = open('db','a') #追加
#操作文件
f.read()
f.readlines()
f.readline()
#关闭文件
f.close()
r+:即可读又可写,需要找到指针的位置
f = open('db', 'r+', encoding="utf-8")
如果打开模式没有b,则read按照字符读取
data = f.read(3)
tell当前指针所在的位置(字节)
print(f.tell())
调整写入指针位置(字节)
f.seek(f.tell())
当前指针位置开始覆盖写入
f.write("admin")
f.close()
打开文件的模式有:
r ,只读模式【默认】
w,只写模式【不可读;不存在则创建;存在则清空内容;】
x, 只写模式【不可读;不存在则创建,存在则报错】
a, 追加模式【可读; 不存在则创建;存在则只追加内容;】
"+" 表示可以同时读写某个文件
r+, 读写【可读,可写】
w+,写读【可读,可写】
x+ ,写读【可读,可写】
a+, 写读【可读,可写】
"b"表示以字节的方式操作
rb 或 r+b
wb 或 w+b
xb 或 w+b
ab 或 a+b
注:以b方式打开时,读取到的内容是字节类型,写入时也需要提供字节类型
fileno文件描述符
flush刷新
readline仅读取一行
truncate截断,指针位置后面的内容清空
f = open('db','r+',encoding = 'utf-8')
for line in f:
print(line)
关闭文件
f.close
with open('xb') as f:
pass
with
with open('db') as f:
pass
#读取db1前10行,然后以只写方式写入db2
with open('db1', 'r', encoding='utf-8') as f1, open("db2", 'w', encoding='utf-8') as f2:
times = 0
for line in f1:
times += 1
if times <= 10:
f2.write(line)
else:
break
#取一行写一行
with open('db3', 'r', encoding='utf-8') as f3, open("db4", 'w', encoding='utf-8') as f4:
for line2 in f3:
new_str = line2.replace("alex", 'steven')
f2.write(new_str)
Day3 set集合、函数和装饰器的更多相关文章
- Python入门day04_函数与装饰器
一.函数入门 什么是函数: # 函数:函数是一系列代码的集,用来完成特定功能的代码块,类似于工具,可以重复不但的去使用 为什么要有函数: # 优点:# 1. 避免代码的冗余 # 2. 让程序代码结构更 ...
- python函数、装饰器、迭代器、生成器
目录: 函数补充进阶 函数对象 函数的嵌套 名称空间与作用域 闭包函数 函数之装饰器 函数之迭代器 函数之生成器 内置函数 一.函数补充进阶 1.函数对象: 函数是第一类对象,即函数可以当作数据传递 ...
- Python入门笔记(19):Python函数(2):函数/方法装饰器
一.装饰器(decorators) 装饰器的语法以@开头,接着是装饰器函数的名字.可选参数. 紧跟装饰器声明的是被装饰的函数和被装饰的函数的可选参数,如下: @decorator(dec_opt_ar ...
- python学习笔记-day4笔记 常用内置函数与装饰器
1.常用的python函数 abs 求绝对值 all 判断迭代器中所有的数据是否为真或者可迭代数据为空,返回真,否则返回假 any ...
- python学习之路-4 内置函数和装饰器
本篇涉及内容 内置函数 装饰器 内置函数 callable() 判断对象是否可以被调用,返回一个布尔值 1 2 3 4 5 6 7 8 9 10 11 num = 10 print(callabl ...
- Fastify 系列教程二 (中间件、钩子函数和装饰器)
Fastify 系列教程: Fastify 系列教程一 (路由和日志) Fastify 系列教程二 (中间件.钩子函数和装饰器) 中间件 Fastify 提供了与 Express 和 Restify ...
- Python入门之函数的装饰器
本章目录: 装饰器: 一.为什么要用装饰器 二.什么是装饰器 三.无参装饰器 四.装饰器语法糖 五.认证装饰器实现 六.叠加多个装饰器 七.带参装饰器 ======================== ...
- Python函数的装饰器修复技术(@wraps)
@wraps 函数的装饰器修复技术,可使被装饰的函数在增加了新功能的前提下,不改变原函数名称,还继续使用原函数的注释内容: 方便了上下文环境中不去更改原来使用的函数地方的函数名: 使用方法: from ...
- Python函数的装饰器修复技术(@wraps)
@wraps 函数的装饰器修复技术,可使被装饰的函数在增加了新功能的前提下,不改变原函数名称,还继续使用原函数的注释内容: 方便了上下文环境中不去更改原来使用的函数地方的函数名: 使用方法 from ...
- python -- 返回函数、匿名函数、装饰器
返回函数 高阶函数的参数可以是函数,那么其返回值也可以是函数. 闭包 对于高阶函数,内部函数可以引用外部函数的参数和局部变量.当调用外部函数返回内部函数时,相关参数和变量都保存在返回的函数(即内部函数 ...
随机推荐
- Linux下p2p的聊天功能实现
Linux下p2p的聊天功能实现细节 Do one thing at a time, and do well. 今天闲着没事,写一个P2P的点对点的聊天功能的小程序,我觉得对网络编程初学者的学习很有用 ...
- BFS zoj 1649
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1649 //hnldyhy(303882171) 11:12:46 // z ...
- json格式键盘编码对照表
整理了一份JSON格式的键盘编码对照表.欢迎转载,但请注明出处,谢谢! { VK_BACK: 8, //退格键 VK_TAB: 9, //TAB键 VK_RETURN: 13, //回车键 VK_SH ...
- UVa 10256 凸包简单应用
题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- 缓存淘汰算法 (http://flychao88.iteye.com/blog/1977653)
1. LRU1.1. 原理 LRU(Least recently used,最近最少使用)算法根据数据的历史访问记录来进行淘汰数据,其核心思想是“如果数据最近被访问过,那么将来被访问的几率也更高”. ...
- ab ApacheBench web测试工具
http://www.ibm.com/developerworks/cn/linux/l-cn-ulimit/ ApacheBench参数说明 格式:ab [options] [http://]hos ...
- 从 ReactiveCocoa 中能学到什么?不用此库也能学以致用
从知道ReactiveCocoa开始就发现对这个库有不同的声音,上次参加<T>技术沙龙时唐巧对在项目中已全面使用FRP的代码家提出为什么这种编程模型出现了这么长时间怎么像ReactiveC ...
- 模板-->Guass消元法(求解多元一次方程组)
如果有相应的OJ题目,欢迎同学们提供相应的链接 相关链接 所有模板的快速链接 简单的测试 None 代码模板 /* * TIME COMPLEXITY:O(n^3) * PARAMS: * a The ...
- codeforces 251A Points on Line(二分or单调队列)
Description Little Petya likes points a lot. Recently his mom has presented him n points lying on th ...
- 将JSON数组显示前台Table中
将JSON数组显示前台Table中 在最近的学习中遇到一个小问题,如何把JSON数组显示在前台的table中,经过一番借鉴和学习之后终于解决了这个问题.具体的代码如下: (前提:利用ajax获取过来的 ...