函数、函数参数、常用模块(json、os、time)

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、如果是字符串、intfloat、元组,需要声明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  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  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  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     loadsload

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再来试试dumpsdump

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模块

5.6.3自己写的模块

猜你喜欢

转载自www.cnblogs.com/taotao0228/p/10088661.html