目录:
一、文件操作
二、三元表达式&列表生成式
三、集合
四、json操作
五、函数
正文:
一、文件操作-自动关闭文件/大文件读取
1、自动关闭文件
with open(xxx) as x:
#f=open('a.txt')#f.close()
#代替以上代码
#文件用完自动关闭
with open('user.txt',encoding='utf-8') as f:
result= f.read()
2、大文件的读取
txt内容:
*******************************
ds,456789
xx,123456
aa,123456
*******************************
代码:
#大文件读
with open('user.txt',encoding='utf-8') as f:for line inf:
line=line.strip()ifline:print(line)
练习
1)读取文件所有内容
# 替换new_str小写转为大写
# 清空原来的文件
# 写进去新的
importos
with open('words.txt') as fr,open('words_new.txt','w') as fw:for line infr:
line=line.strip()if line: #判断空行
line=line.upper()
fw.write(line+'\n')
os.remove('words.txt')
os.rename('words_new.txt','words.txt')
练习2)监控日志,找到每分钟请求大于200的,加入黑名单
日志文件格式:
importtime
point=0whileTrue:
ips={} #ip:count
f=open('access.log',encoding='utf-8')
f.seek(point)for line inf:
line=line.strip()ifline:
ip=line.split()[0]if ip inips:
ips[ip]+=1
else:
ips[ip]=1point=f.tell() #记录指针位置
f.close()for ip inips:
count=ips[ip]if count>=200:print('要加入黑名单的ip地址是:%s'%ip)
time.sleep(60)
二、三元表达式、列表生成式
1、三元表达式
原if..else判断代码
age = 18
if age<18:
v='未成年'
else:
v='成年人'
print(v)
使用三元表达式:
v='未成年' if age<18 else '成年人'
print(v)
2、列表生成式
将a列表加入b列表:
a=[1,2,3,4,5,6]
b=[]for i ina:
b.append(str(i))
使用列表生成式:
#列表生成式
c=[str(i) for i in a]
使用列表生成式且只取奇数:
#对2取余
d=[str(i) for i in a if i%2!=0]print(c)print(d)
三、集合
set 天生去重,无序的(没有下标)
1、list、集合、字典
l=[1,2,11,1,1,3,5,7]
l2={1,2,3,4,5,1,1} #集合
l3={} #字典
l3=set()#集合
s=set(l) #list转集合print(s)print(l2)
2、集合的增删改查
1)新增
l3=set()
l3.add(1) #新增元素
print(l3)
2)删除元素
l3.remove(1) #删除元素
print(l3)
3)把1个集合加入到另一个集合里面
l3.update(l2) #把1个集合加入到另一个集合里面
print(l3)
l3.copy(l2) #浅拷贝
3、交集 并集 差集
1)取交集
stu1 = ['fd','wxl','zjr','lhy']
stu2= ['fd','wxl','dsx','cc']
stu1_set=set(stu1)
stu2_set=set(stu2)#取交集
print(stu1_set.intersection(stu2_set))
print(stu1_set &stu2_set)
练习:输入密码需包含大写、小写字母、数字否则提示错误
importstring
password='abc123'password_set=set(password)if password_set & set(string.digits) and password_set & set(string.ascii_lowercase) and password_set &set(string.ascii_uppercase):print("密码合法")else:print("密码需要包含大写、小写字母、数字")
2)取并集
#取并集 把两个集合合并到一起
s1 = {1,2,3,4}
s2= {4,5,6,7}print(s1.union(s2))
print(s1 | s2)
3)取差集
#取差集 在一个集合里面存在,在另一个集合不存在的
s1 = {1,2,3,4}
s2= {4,5,6,7}print(s1.difference(s2))
print(s1-s2)
4)对称差集
#对称差集 去除两个集合交集
s1 = {1,2,3,4}
s2= {4,5,6,7}print(s1 ^ s2)
print(s1.symmetric_difference(s2))
4、集合可循环
for s ins1:print(s)
六、JSON操作
#json就是一个字符串,只不过所有语言都能解析这个字符串
#json.dumps()
#(list\tuple\dict)python的数据类型转json的
#ensure_ascii=False显示中文 indent=4缩进,格式化
1、python的数据类型-->json
importjson
d={'name':'xiaohei','cars':[1,2,3],'house':(4,5,6),'addr':'北京'}
result= json.dumps(d,ensure_ascii=False,indent=4)print(d)print(result)print(type(result))
2、json--->python数据类型
json_str = '{"name": "xiaohei", "cars": [1, 2, 3], "house": [4, 5, 6]}'dict2=json.loads(json_str)print(dict2)
3、处理文件
# # json.load()#帮你封装 处理文件的功能
# f=''
# # content = f.read()
# # d=json.loads(content)
# d=json.load(f)
# # json.dump()#帮你封装 处理文件的功能
# json_str = json.dumps(d,indent=4,ensure_ascii=False)
# f.write(json_str)
# json.dumps(d,f,indent=4,ensure_ascii=False)
d={'name':'xiaohei','cars':[1,2,3],'house':(4,5,6),'addr':'北京'}
with open('info.txt','w',encoding='utf-8') as fw: json.dump(d,fw,indent=4,ensure_ascii=False) with open('info.txt',encoding='utf-8') as fw: d=json.load(fw)print(d)print(d.get('name'))print(d.get('money'))
七、函数
1、函数及方法
importstringdef hello():#定义函数,提高代码的复用性
print('nihao')
hello()
练习1:写一个函数校验密码是否合法
def check_password(password):#校验密码是否合格,必传参数,位置参数
password_set =set(password)if password_set & set(string.digits) and password_set & set(string.ascii_lowercase) and password_set &set(string.ascii_uppercase):print("密码合法")returnTrueelse:print("密码需要包含大写、小写字母、数字")returnFalse
password_result=check_password('dffsdfs1232A')print(password_result)
备注:练习1中 定义函数时def check_password(password):传入的password为形式参数(形参);调用方法时password_result=check_password('dffsdfs1232A')传入的dffsdfs1232A为实际参数(实参)
练习2 将读/写文件写成函数
写文件
defwrite_file(file_name,content):
with open(file_name,'w',encoding='utf-8') as fw:
fw.write(content)#三种传参方式
write_file('1.txt','123456')
write_file(content='1234567',file_name='1.txt')
write_file('1.txt',content='12345678')
读文件
defread_file(file_name):
with open(file_name,'r', encoding='utf-8') as fr:
content=fr.read()returncontent
a=read_file('1.txt')print(a)
练习3:判断输入数字是否为小数
defis_float(s):
s=str(s)if s.count('.')==1:
left,right=s.split('.')if left.isdigit() andright.isdigit():returnTrueif left.startswith('-') and left.lstrip('-').isdigit() andright.isdigit():returnTruereturn False #不能用else 否则-A1.3这种情况返回空print(is_float('-1.3'))
print(is_float('-A1.3'))
print(is_float('-.3'))#函数里面遇到return,函数立即结束
2、默认值参数
def op_file(file_name,content=None):print(content)ifcontent:
write_file(file_name,content)else:
result=read_file(file_name)returnresultprint(op_file('1.txt'))
op_file('1.txt','sdsfsdgrfssssssss')
3、函数返回值
#如果一个函数没有写返回值,那么返回的就是None
#如果函数有多个返回值,那么返回的是一个元祖
deftest():print('hello')deftest2():return 1,2,3
print(test())print(test2())
a,b,c=test2() #拆包形式
4、全局变量、局部变量
#全局变量:一般定义在代码的最上边,大家都可以用
#局部变量:在函数里面定义的变量都是局部变量
#list、dict、set 不需要global声明
#str、int、float、tuple、bool需要声明
country = 'China'file_name= '123'
defsay():print(country)
word= 'Nihao'
defzc():
country='Japan'
print(country)defupdate_file_name():globalfile_name
file_name= 'a.json'say()
zc()
update_file_name()print(country)print(file_name)
练习1:
#money返回多少
money = 500
deftest(consume):return money-consumedeftest1(money):return test(money)+money
money=test1(money)print(money)
答案:500
练习2:以下代码打印出的结果是?
deftest():globala
a= 5
deftest1():
c= a+5
returnc
res=test1()print(res)
答案:报错
#需改为
#test()
# res = test1()
# print(res)
5、函数参数:
#必传参数(位置参数)、默认值参数
#可选参数(参数组)、关键字参数
1)可选参数
def send(*args): #可选参数 它不是必传的,不限制参数个数,他是把参数放到了一个list里面
for p inargs:print('发短信给xxx%s'%p)
send()
send(110)
send(110,120,119)
2)关键字参数
#关键字参数,它不是必传的,不限制参数个数#它是把参数放到一个字典里面,但是它传参的时候必须用关键字的方式
def send_sms(**kwargs):print(kwargs)
send_sms()
send_sms(xzh='晚上好')
send_sms(lhh='新年好',fd='生日快乐',lyh='新婚幸福')
3)函数参数传入顺序
def nb_func(name1,age,country='China',sex='女',*args,**kwargs):#1必填参数 name1,age
#2默认值参数 country
#3参数组 *args
#4关键字参数 **kwargs
print(name1)print(age)print(country)print(args)print(kwargs)
nb_func('xh',18,'Japan','nan','abc','efg','hhh',name=1,b=2,c=3)print()
nb_func('xh',18,'Japan','nan','abc','efg','hhh','aaa0','bbb','cccc')