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-8
s = "二万画画"
# 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集合、函数和装饰器的更多相关文章

  1. Python入门day04_函数与装饰器

    一.函数入门 什么是函数: # 函数:函数是一系列代码的集,用来完成特定功能的代码块,类似于工具,可以重复不但的去使用 为什么要有函数: # 优点:# 1. 避免代码的冗余 # 2. 让程序代码结构更 ...

  2. python函数、装饰器、迭代器、生成器

    目录: 函数补充进阶 函数对象 函数的嵌套 名称空间与作用域 闭包函数 函数之装饰器 函数之迭代器 函数之生成器 内置函数 一.函数补充进阶 1.函数对象:  函数是第一类对象,即函数可以当作数据传递 ...

  3. Python入门笔记(19):Python函数(2):函数/方法装饰器

    一.装饰器(decorators) 装饰器的语法以@开头,接着是装饰器函数的名字.可选参数. 紧跟装饰器声明的是被装饰的函数和被装饰的函数的可选参数,如下: @decorator(dec_opt_ar ...

  4. python学习笔记-day4笔记 常用内置函数与装饰器

    1.常用的python函数 abs             求绝对值 all               判断迭代器中所有的数据是否为真或者可迭代数据为空,返回真,否则返回假 any          ...

  5. python学习之路-4 内置函数和装饰器

    本篇涉及内容 内置函数 装饰器 内置函数 callable()   判断对象是否可以被调用,返回一个布尔值 1 2 3 4 5 6 7 8 9 10 11 num = 10 print(callabl ...

  6. Fastify 系列教程二 (中间件、钩子函数和装饰器)

    Fastify 系列教程: Fastify 系列教程一 (路由和日志) Fastify 系列教程二 (中间件.钩子函数和装饰器) 中间件 Fastify 提供了与 Express 和 Restify ...

  7. Python入门之函数的装饰器

    本章目录: 装饰器: 一.为什么要用装饰器 二.什么是装饰器 三.无参装饰器 四.装饰器语法糖 五.认证装饰器实现 六.叠加多个装饰器 七.带参装饰器 ======================== ...

  8. Python函数的装饰器修复技术(@wraps)

    @wraps 函数的装饰器修复技术,可使被装饰的函数在增加了新功能的前提下,不改变原函数名称,还继续使用原函数的注释内容: 方便了上下文环境中不去更改原来使用的函数地方的函数名: 使用方法: from ...

  9. Python函数的装饰器修复技术(@wraps)

    @wraps 函数的装饰器修复技术,可使被装饰的函数在增加了新功能的前提下,不改变原函数名称,还继续使用原函数的注释内容: 方便了上下文环境中不去更改原来使用的函数地方的函数名: 使用方法 from ...

  10. python -- 返回函数、匿名函数、装饰器

    返回函数 高阶函数的参数可以是函数,那么其返回值也可以是函数. 闭包 对于高阶函数,内部函数可以引用外部函数的参数和局部变量.当调用外部函数返回内部函数时,相关参数和变量都保存在返回的函数(即内部函数 ...

随机推荐

  1. c++学习(1)

    c++学习(1) 1.const C VS C++: 在c语言中const是一个只读变量(ReadOnly Varible),在c++中const只是代表常量(Constant). 例: const ...

  2. 【转】Linux下查看所有用户及用户组

    groups 查看当前登录用户的组内成员groups gliethttp 查看gliethttp用户所在的组,以及组内成员whoami 查看当前登录用户名/etc/group文件包含所有组/etc/s ...

  3. Linux一键安装PHP/JAVA环境OneinStack

    OneinStack 是一款PHP/JAVA环境一键配置工具.                         OneinStack包含以下组合   lnmp(Linux + Nginx+ MySQL ...

  4. opencv2对读书笔记——使用均值漂移算法查找物体

    一些小概念 1.反投影直方图的结果是一个概率映射,体现了已知图像内容出如今图像中特定位置的概率. 2.概率映射能够找到最初的位置,从最初的位置開始而且迭代移动,便能够找到精确的位置,这就是均值漂移算法 ...

  5. STM8S 独立看门狗配置及使用

    //独立看门口的时钟来源 内部低速时钟 128khz 除以2 即64khz //选择 IWDG_Prescaler_128 //64/128 =0.5 khz 2ms周期 #define IWDG_5 ...

  6. What is therelationship between @EJB and ejb-ref/ejb-local-ref?

    http://glassfish.java.net/javaee5/ejb/EJB_FAQ.html What is therelationship between @EJB and ejb-ref/ ...

  7. android 自定义progressDialog实现

    我们在项目中经常会遇到这样一个应用场景:执行某个耗时操作时,为了安抚用户等待的烦躁心情我们一般会使用进度条之类的空间,在android中让 大家最容易想到的就是progressbar或者progres ...

  8. Java数学表示式解析工具- jeval

    这个包能够为我们提高高效的数学表达式计算. 举个样例:这个是我们策划给出的游戏命中率的一部份计算公式 是否命中=a命中率 – (b等级 – a等级) * (命中系数(6)* b闪避率 / 100)+3 ...

  9. PHP安全编程:留心后门URL 直接可以通过URL访问(转)

    后门URL是指虽然无需直接调用的资源能直接通过URL访问.例如,下面WEB应用可能向登入用户显示敏感信息: <?php $authenticated = FALSE; $authenticate ...

  10. Java基础知识强化之IO流笔记14:递归之输出指定目录下所有java文件绝对路径的案例

    1. 需求:输出指定目录下的所以.java结尾文件的绝对路径的案例:  分析:  A:封装目录  B:获取该目录下的所有文件和文件夹的File数组  C:遍历这个File数组,得到每一个File对象的 ...