''' 集合基本操作 '''#1.添加元素,如果元素已存在,则不进行任何操作
s.add(x)#2.添加元素,一次添加多个,用逗号隔开
s.update( x )#3.移除元素(3种方法)
s.remove(x)
s.discard(x)
s.pop(x)#这个就是随机删除元素#4.计算集合元素个数len(s)#5.清空集合
s.clear()#6.判断元素是否在集合中存在
x in s
a ='hello'# id(a)
a = a +'world'# id(a) 内存地址已经改变,所以是新的内存区域
b ='python'
b[0]='b'# 会报错,因为不可改变,是原有值不可改变
b ='php'# 不会报错,因为是重新赋值,开辟新的内存块# 上述情况,在PHP中就不会存在
$a ='php';
$a[0]='t';#单一字符是没问题,但是如果是’python'就不会替换,应该是内存区块大小限制了print($a);#可以正常打印
列表的可变与元组的不可变
稳定性,元组
运算符
算术运算符 + 加 - 减 * 乘 / 除 // 整除 % 取余 ** 幂 2.赋值运算符 = += *= /= %= //= Python中没有自增自减运算符++ – 3.关系运算符 == != > < >= <= 4.逻辑运算符 and 且 or 或 not 非 5.成员运算符 in not in 字典类型判断是key 6.身份运算符 is (比较的是内存地址) is not 7.位运算符 (把数字当做二进制数来进行运算) & 按位与 | 按位或 ^ 按位异或 ~ 按位取反 << 左移动 >> 右移动
a ={1,2,3}
b ={2,1,3}
a == b #true,集合无序
a is b #false ,比较的是内存地址
a =(1,2,3)
b =(2,1,3)
a == b #false ,元组是有序的
a is b #false ,比较内存地址#比较变量,三方面:值(==),类型(type),身份(is)#isinstance(a,string)
res =1,2,3# 序列封包,封包成一个元组赋值给res变量print(res)# 输出是序列:(1, 2, 3)print(type(res))# 查看类型是元组类型
x, y, z = res # 序列解包,序列中的元素依次赋值给xyz三个变量
x,y,z =1,2,3# 链式赋值
7.3 函数参数
形参
实参
关键字参数,是为了提高代码可读性
默认参数
可变参数
关键字可变参数
#形参defget_userinfo(username,password):pass#实参
get('laravelvue','123')#关键字参数
get(username='laravelvue',password='123')#默认参数defget_ipinfo(ip,address='0.0.0.0')#可变参数defget_equipmentinfo(*param)#可以传递多个参数
get_equipmentinfo('app','mobile')#如果传递元组、列表等,需要加上星号
info =('wxapp','mobile')
get_equipmentinfo(*info)#加上星号相当于解包成单个参数,所以函数获取到的就是一个一维元组,如果不加星号,那么得到的是二维元组#可变关键字参数#想要传可变关键字,必须有两个星号,如果不加,就不能传递可变关键字参数defcity_temp(**param):#打印字典,要调用items()方法for key,value in param.items():print(key,':',value)
city_temp(bj='31c',sh='36')#传递的是元组,函数接收解析之后是字典#如果想直接传递一个字典,必须需要加上两个星号。如果不加星号就会是一个被元组包裹的字典,还是元组
info ={'bj':'31c','sh':'36c'}
city_temp(**info)
7.4 变量作用域,全局变量,局部变量
函数体里可以使用全局变量,函数体外不可使用局部变量,但也不绝对,看具体函数
c =10defdemo():print(c)#函数体里可以使用全局变量,c变量的作用域是整个代码块for i inrange(0,9):
a ='未预定义变量'
c += i
print(a)#竟然是可以打印的,不需要预定义,因为在Python中,一个代码块,或者一个for循环,是不能成为一个作用域的, 一个函数是有作用域的。真心不习惯,PHP,Java是直接报错的print(c)#作用域链,作用域有个逐级寻找的。在PHP,Java中下面的代码一定是错的,因为变量未定义是不可使用的,而且未定义变量就调用,即使Python可以节省一行代码,但是可读性差
c =1deffunc1():
c =2deffunc2():
c =3print(c)
func2()
func1()#一次把c=3,c=2注释,打印结果为 3-2-1
‘’‘ 引入Python正则库 ’‘’
import re
str='Python|PHP|Java|C|C++'#方法一:使用re.findall 返回结果为列表
res = re.findall('Python',str)#方法二:使用index()
res =str.index('Python')#方法三:使用inprint('Python'instr)iflen(res)>0 :
print('Yes')else:print('No')
9.2 正则表达式规则
模式
描述
^
匹配字符串开头
$
匹配字符串结尾
.
匹配任意字符,除了换行符
[…]
用来表示一组字符,[abc]匹配a或b或c
[^…]
不在[]中的字符,[^abc]匹配除了abc的其他字符
re*
匹配0个或多个表达式
re+
匹配一个或多个表达式
re?
匹配0个或一个符合前面正则表达式片段,非贪婪模式
re{n}
匹配n个前面正则表达式
re{n,}
精确匹配n个前面正则表达式,a{1,}相当于a+,a{0,}相当于a*
re{n,m}
匹配n到m次由前面的正则表达式匹配的片段,贪婪模式
a|b
a或b
(re)
匹配括号内的表达式,也表示一个组
\w
匹配数字字母下划线
\W
匹配非数字字母下划线
\s
匹配任意空白字符,相当于[\t\n\r\f]
\S
匹配任意非空字符
\d
匹配任意数字,相当于[0-9]
\D
匹配任意非数字
* 匹配0次或无限次
+ 匹配1次或无限次
? 匹配0次或1次
[] 中括号之间是或关系
() 小括号之间是且关系
9.3 re.sub()正则替换
re.sub(正则规则,替换成的字符,原始字符串,替换次数0是无限次)
import re
str='A12CED23412398075'defconvert(value):
matched = value.group()ifint(matched)>=6:return'9'else:return'0'#将函数当做参数传入函数中
res = re.sub('\d',convert,str)print(res)
defadd():defaddall():passreturn addall #函数可以作为一个返回结果被返回
f = add()#函数可以赋值给一个变量
闭包 = 函数 + 环境变量,把函数调用时的现场进行了保存
deff1():
a =10deff2():
a =20print(a)print(a)
f2()print(a)
f1()# 10-20-10''' 理解闭包 '''deff1():
a =10deff2():
a*20#如果在这里不是引用了环境变量(全局变量)里的a,而是重新给a赋值,使用了局部变量;或者不使用环境变量,那么这就不是个闭包函数了return f2
f = f1()print(f.__closure__)
import time
defdecorator(func):defwrapper():print(time.time())
func()return wrapper
@decorator
deff1():print('This is a function')# f = decorator(f1)# f() #这里f已经是一个函数,但是破坏了一般的调用方式,那如果还是想直接调用f1函数,那么就体现了装饰器的作用
f1()