5.1列表生成式
s =[1,2,3,4,5,6,7,8]
for i in s:
print(i+1)#第一种方式
res = [ i+1 for i in s]
print(res)#第二种方式,这两种方式的区别是第二种放在一个list内了
s =[1,2,3,4,5,6,7,8]
res = [str(i) for i in s]
print(res)
运行结果:['1', '2', '3', '4', '5', '6', '7', '8']
5.2函数
def func(a,b):
res = a+b
print(res)
def func2(a,b):
res = a+b
return res
func(1,2)
res=func2(1,2)
print(res)
上面两个函数的打印结果都是3,只是func没有返回值,只是打印了一下,而func2有返回值
def get_user():
s = 'abc,123'
username,password = s.split(',')
return username,password
res=get_user()#返回两个值也可以用一个变量来接收
print(res)
运行结果:('abc', '123')返回的是一个元组
return的作用:1、把函数处理的结果返回2、结束函数,函数里面遇到return,函数立即结束
def get_user():
s = 'abc,123'
username,password = s.split(',')
return username,password
def login():
for i in range(3):
username, password = get_user()
user = input('username:')
pwd = input('password:')
if username==user and password==pwd:
print('登录成功')
return
else:
print('账号/密码错错误!')
login()
运行结果是:
username:111
password:222
账号/密码错错误!
username:111
password:aaa
账号/密码错错误!
username:abc
password:123
登录成功
5.3函数参数
def say(word):
pass#什么也不相干的话,就直接写个pass
def say(word='haha'):
print(word)
say()
运行结果:haha
def say(word='haha'):
print(word)
say('你好')
运行结果:你好
如果调用函数时,传了参数,那么取传入的参数;如果不传参数,就取默认值
def mysql(username,password,ip,host=3306):#如果有必传参数,又有默认值参数,那么默认值参数要写在最后面
既能读又能写的函数:#如果传入了内容,那么就是写文件,如果没有传入内容,就是读文件
def op_file(filename,content=None):
with open(filename,'a+',encoding='utf-8') as fw:
fw.seek(0)#a+的文件指针在末尾
if content:
fw.write(content)
else:
return fw.read()#也可以换成res=fw.read() return res
op_file('zaozao.txt','妈妈爱早早')
需求分析:
1、判断小数点个数是否为1
2、按照小数点分隔,取到小数点左边和右边的值
3、判断正小数,小数点左边为整数,小数点右边为整数
4、判断负小数,小数点左边以负号开头,并且只有一个负号,负号后面为整数,小数点右边为整数
def is_float(s):
s=str(s)#分隔这是字符串才有的方法
if s.count('.')==1:#判断只有一个小数点
left,right = s.split('.')#以小数点分隔,分隔完以后,用两个变量接收
if left.isdigit() and right.isdigit():
print('正小数')
return True
elif left.startswith('-') and left.count('-')==1 and \
left[1:].isdigit() and right.isdigit():
print('负小数')
return True
print('不合法')
return False
is_float(1)
is_float(0)
is_float(0.5)
is_float(-3.5)
is_float('-s.1')
is_float('--98.9')
is_float('--9s8.9s2')
is_float('6')
5.4全局变量
name = '小明'
def a():
name='hahaha'#局部变量
print(name)
def b():
print(name)#自己里面找不到变量,使用全局变量
a()
b()
运行结果是:
hahaha
小明
注意:
1、如果是字符串、int、float、元组,需要声明global
name = '小明'
def a():
global name#声明更改的是全局变量,尽量少使用全局变量
name='hahaha'
print(name)
def b():
print(name)#自己里面找不到变量,使用全局变量
a()
b()
运行结果:
hahaha
hahaha
2、如果是list、字典、集合的时候,不用声明global,即可以使用
stus=[]
def a():
stus.append('abc')
def b():
print(stus)
a()
b()
运行结果:['abc']
money = 500
def test(consume):
return money - consume
def test1(money):
return test(money) + money
money = test1(money)
print(money)
运行结果是:500
def test():
global a
a = 5
def test1():
c = a + 5
return c
#test()#如果该行被注释掉,那么会报错,如果该行不被注释,运行结果是10.原因是:被注释掉的话,test函数仅仅是被定义了而已,么有被调用,就不会有全局变量,当然报错
res = test1()
print(res)
list=[1,1,2,3,4]
下标 0 1 2 3 4
for i in list:
if i%2!=0:
list.remove(i)
print(list)
运行结果是:[1, 2, 4]
原因:第一次运行的时候,取到1,1被删除,此时list列表中剩余的元素[1,2,3,4],现在的下标变成了0 1 2 3 ,循环的时候,下标为0的已经循环过了,所以会从下标为1 的开始循环。
结论:不要循环删list,会导致结果错乱
解决方法:定义两个一样的列表,循环list2,从list1中删元素
list1=[1,1,2,3,4]
list2=[1,1,2,3,4]#或者list2=list1[:],使用切片的方式复制一个list
for i in list2:#循环list2
if i%2!=0:
list1.remove(i)#从list1中删除元素
print(list1)
运行结果:[2, 4]
list1=[1,1,2,3,4]
list2=list1#这个样子定义相同的list,么有效果,因为内存地址是一样的
for i in list2:#循环list2
if i%2!=0:
list1.remove(i)#从list1中删除元素
print(list1)
print(id(list1))
print(id(list2))
运行结果:
[1, 2, 4]
2102194967176
2102194967176
浅拷贝:两个变量指向的是同一块内存地址
深拷贝:是会开辟一个新的内存地址,存放数据,就是两块不同内存。
import copy
# 0 1 2 3
num1 = [1,1,2,3,4,5,6,7,7,8]
num2 = num1 #浅拷贝,指向的内存地址是同一个
#num2 = copy.deepcopy(num1)#深拷贝,就是开辟一块新的内存地址
print(id(num1))
print(id(num2))
运行结果:
2019399340232
2019399340232
import copy
# 0 1 2 3
num1 = [1,1,2,3,4,5,6,7,7,8]
#num2 = num1 #浅拷贝,指向的内存地址是同一个
num2 = copy.deepcopy(num1)#深拷贝,就是开辟一块新的内存地址
print(id(num1))
print(id(num2))
运行结果:
2400694669512
2400694669768
5.5可变参数、关键字参数
PORT=3306 #如果变量名字全部大写,就代表常量,值不会变,大家都可以使用。
5.5.1可变参数
def mysql2(*info):
print(info)
mysql2('user',13345435,00000,'sefsd','sdfds')
运行结果:('user', 13345435, 0, 'sefsd', 'sdfds') 把参数都放在一个元组内了
例如:给部门员工发邮件
def send_mail(*email):#习惯性大家都写*args,但是写啥都无所谓
print(email)
send_mail('[email protected]')#传入几个就发几个邮件
send_mail('[email protected]','[email protected]','[email protected]')
参数类型:
1、 必填参数,位置参数
2、 默认值参数,非必填
3、 可变参数,非必传,不限制参数个数,比如说给多个人发邮件,发邮件的人数不确定,就可以
用可变参数
def calc(a,b):
print(a+b)
return a+b
list = [1,2]
calc(*list)#把list中的元素解开,再分别传给函数
运行结果:3
注意:
1、 如果定义函数的时候写了两个参数,而list中给了三个参数,那么运行会报错,TypeError: calc() takes 2 positional arguments but 3 were given
2、 如果定义函数时写了三个参数,而list中给了两个参数,那么运行会报错,TypeError: calc() missing 1 required positional argument: 'c'
5.5.2关键字参数:使用不多,了解即可
关键字参数非必填,不限制参数个数,但是会把传过来的关键字参数放到一个字典里面,传参的时候,必须得用k=v这样子来传
def mysql(**mysql_info):
print(mysql_info)
mysql()#运行结果是空字典
mysql('ip','user')#报错,原因是传过来的参数直接给放在一个字典内,直接这样传,分不清key-value
mysql(ip='10.138.11.4',port=3306)#运行结果也是空字典
def request(url,method,**kwargs):
#两个星号就表示把传入的参数放在一个字典里面,这种方式使用不多,了解即可
print(url)
print(method)
print(kwargs)
request('api.nnzhp.cn','get',header='sdfsdfsdf=sdfdsfs',file='/xx/xxx/a.txt')
运行结果:
api.nnzhp.cn
get
{'header': 'sdfsdfsdf=sdfdsfs', 'file': '/xx/xxx/a.txt'}
def request(url,method,**kwargs):
print(url)
print(method)
print(kwargs)
if kwargs.get('data'):
data = kwargs.get('data')
elif kwargs.get('file'):
file = kwargs.get('file')
request('api.nnzhp.cn','get',header='sdfsdfsdf=sdfdsfs',file='/xx/xxx/a.txt')
运行结果:
api.nnzhp.cn
get
{'header': 'sdfsdfsdf=sdfdsfs', 'file': '/xx/xxx/a.txt'}
def mysql(host,user,password,port,charset,sql,db):
print(host)
print(user)
print(password)
print(port)
print('连接mysql')
dic = {
'host':'192.168.1.1',
'user':'root',
'password':123456,
'port':3306,
'charset':'utf-8',
'sql':'sql',
'db':'db'
}
mysql(**dic)#两个星号会把字典拆开,然后传给函数。
注意:一个星号拆分的是元组或者list,两个星号拆分的是字典
运行结果:
192.168.1.1
root
123456
3306
连接mysql
5.6常用模块
主要有标准模块、第三方模块、自己写的模块
模块:一个py文件就是一个模块
5.6.1标准模块
time模块 random模块
5.6.1.1json模块
import json #解析json的
json,就是一个字符串
import json
#解析json的
json_str = '''
{"name":"王志华","age":25,"sex":"女"}
'''
#json中必须都是双引号,不能是单引号
res = json.loads(json_str) #把字符串(json串)转成字典
print(res)
print(type(json_str))
print(type(res))
运行结果:
{'name': '王志华', 'age': 25, 'sex': '女'}
<class 'str'>
<class 'dict'>
Json转成字典,用loads()
字典转成字符串(json),用dumps()
import json
dic = {'name':"xiaohei","age":18,"password":12345,"sex":"男","addr":"北京"}
res = json.dumps(dic)#把字典变成字符串
print(res)
print(type(res))
运行结果:
{"name": "xiaohei", "age": 18, "password": 12345, "sex": "\u7537", "addr": "\u5317\u4eac"}
<class 'str'>
看不懂,加上ensure_ascii=False就可以了
import json
dic = {'name':"xiaohei","age":18,"password":12345,"sex":"男","addr":"北京"}
res = json.dumps(dic,ensure_ascii=False)#把字典变成字符串
print(res)
print(type(res))
运行结果:
{"name": "xiaohei", "age": 18, "password": 12345, "sex": "男", "addr": "北京"}
<class 'str'>
import json
dic = {
"xiaohei":{
"age":18,
"password":12345,
"sex":"男",
"addr":"北京"
},
"马春波":{
"age":18,
"password":12345,
"sex":"男",
"addr":"北京"
},
"王东泽":{
"age":18,
"password":12345,
"sex":"男",
"addr":"北京"
},
}
res = json.dumps(dic,ensure_ascii=False,indent=4)#把字典变成字符串,ascii是为了解决中文的问题,indent是为了解决缩进问题
print(res)
print(type(res))
运行结果:
{
"xiaohei": {
"age": 18,
"password": 12345,
"sex": "男",
"addr": "北京"
},
"马春波": {
"age": 18,
"password": 12345,
"sex": "男",
"addr": "北京"
},
"王东泽": {
"age": 18,
"password": 12345,
"sex": "男",
"addr": "北京"
}
}
<class 'str'>
5.6.1.2.1 loads和load
import json
dic = {
"xiaohei":{
"age":18,
"password":12345,
"sex":"男",
"addr":"北京"
},
"马春波":{
"age":18,
"password":12345,
"sex":"男",
"addr":"北京"
},
"王东泽":{
"age":18,
"password":12345,
"sex":"男",
"addr":"北京"
},
}
f = open('user.json',encoding='utf-8')
res = json.loads(f.read())#把字符串转成字典
print(res)
运行结果:
{'xiaohei': {'age': 18, 'password': 12345, 'sex': '男', 'addr': '北京'}, '马春波': {'age': 18, 'password': 12345, 'sex': '男', 'addr': '北京'}, '王东泽': {'age': 18, 'password': 12345, 'sex': '男', 'addr': '北京'}}
import json
dic = {
"xiaohei":{
"age":18,
"password":12345,
"sex":"男",
"addr":"北京"
},
"马春波":{
"age":18,
"password":12345,
"sex":"男",
"addr":"北京"
},
"王东泽":{
"age":18,
"password":12345,
"sex":"男",
"addr":"北京"
},
}
f = open('user.json',encoding='utf-8')
res = json.load(f)#load是操作文件的,直接传文件名就行
print(res)
运行结果:
{'xiaohei': {'age': 18, 'password': 12345, 'sex': '男', 'addr': '北京'}, '马春波': {'age': 18, 'password': 12345, 'sex': '男', 'addr': '北京'}, '王东泽': {'age': 18, 'password': 12345, 'sex': '男', 'add r': '北京'}}
总结:loads:要先读出来,然后把字符串转成字典
Load:直接操作文件
5.6.1.2.2再来试试dumps和dump
import json
dic = {
"xiaohei":{
"age":18,
"password":12345,
"sex":"男",
"addr":"北京"
},
"马春波":{
"age":18,
"password":12345,
"sex":"男",
"addr":"北京"
}
}
#dump 自己写的
fw = open('newuser.json','w')
json.dump(dic,fw,indent=4,ensure_ascii=False)
5.6.1.2 os模块
5.6.1.3 time模块
5.6.2第三方模块:别人已经写好了,我们安装就行了
连mysql模块,xpinyin模块