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. maven src/test/resources 下的logback-test.xml 读取 properties文件中的key-value值

    <profiles>        <profile>            <id>test-cd</id>            <prope ...

  2. Django教程:第一个Django应用程序(3)

    Django教程:第一个Django应用程序(3) 2013-10-08 磁针石 #承接软件自动化实施与培训等gtalk:ouyangchongwu#gmail.comqq 37391319 #博客: ...

  3. 2016最新cocoapods版本更新,以及多个版本的问题

    先删除之前的pod 在终端中执行下面命令. 删除目录下的podrm -rf /usr/local/bin/pod 执行gem list | grep cocoapods 查看所有与cocoapods相 ...

  4. java 吞吐量

    jvm中 ,执行用户的代码占 的时间/总时间 ,假如前者是99 分钟,后者一分钟,则吞吐量为99% ,吞吐量越大.系统越好,如何设计系统,导致系统吞吐量高,因为我们知道,垃圾回收,7种垃圾收集器,也不 ...

  5. POJ 3384 Feng Shui 半平面交

    题目大意:一个人很信"Feng Shui",他要在房间里放两个圆形的地毯. 这两个地毯之间可以重叠,可是不能折叠,也不能伸到房间的外面.求这两个地毯可以覆盖的最大范围.并输出这两个 ...

  6. [Javascrip] Logging Timing Data to the Console

    Learn to use console.time with console.timeEnd to get accurate timings of operations in javascript. ...

  7. 从零开始学习jQuery-------jQuery元素选择器(三)

    下面我们来介绍一下jQuery元素选择器,在Web开发中我们最常用的操作是获取元素,然后对获取的元素进行一系列的操作,jQuery根据获取页面元素的不同,可以将jQuery选择器分为四大类:基本选择器 ...

  8. Eclipse中使用git把项目导入到osc@git中

    方便Eclipse用户使用Git把项目导入到osc@git中进行管理. Eclipse Git osc@git 一.原有项目:  项目名为TestGit 二.在osc@git上面创建一个新项目库. 填 ...

  9. 如何开通www国际域名个人网站

    欢迎访问我的域名http://www.baiqiantao.xyz 一.准备知识 什么是域名? 所有以www开头的域名,就是国际域名:不以www开头的域名,都是为子域名. 域名都有后缀,后缀是有意义的 ...

  10. codevs 1047 邮票面值设计

    /* 开始没啥好的思路 暴力吧 T的太严重 加了k>n的特判 结果没数据…..然后又暴力生成了几组答案 打表 然而有没有数据 华丽的爆零了 正解 回溯+DP 回溯生成k数组 然后DP找最优解更新 ...