关键字参数1
def mysql(host,user,password,port,charset,sql,db):
print(host) print(user) print(password) print(port) print(charset) print(sql) print(db) print('连接mysql') dic = { 'host':'192.168.1.1', 'user':'root', 'password':123456, 'port':3306, 'charset':'utf-8', 'sql':'sql', 'db':'db' } mysql(**dic) #**dic,传值的时候,会把字典每一项内容写成 host=192.168.1.3方式,全部传值给mysql函数,不用一项一项的输入实参了 输出结果如下: 192.168.1.1 root 123456 3306 utf-8 sql db 连接mysql
关键字参数2
def mysql(**mysql_info): # 实参传值时,需要指定 关键字参数=‘位置参数’
print(mysql_info)
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',data='88',file='u/a/n')
# header='sdfsdfsdf=sdfdsfs',file='/xx/xxx/a.txt')
mysql(ip='ip',user='user')
关键字参数3
def send_mail(*args): # *关键字参数,可以一次传一个实参,也可以一次传多个实参
print(args)
send_mail('qqq@qq.com')
send_mail('qqq@qq.com','asaaa@163.com','ddd@sina.com')
def calc(a,b,c):
print(a+b)
return a+b
l = [1,2,3]
calc(*l) # 一次传所有列表位置参数给形参
可变参数1
----形参只写关键字参数
----实参一一对应传值位置参数
def mysql(host,user,password,port,charset,sql,db):
print('连接mysql')
mysql('ip','user','sdfsdf',3306,'sdfsdf','select','db')
可变参数2
----实参传值,指定关键字参数=‘位置参数’,可以无序传给形参
mysql(user='root',password='123456',host='192.168.1.3',
port=3306,sql='sdfsdf',db='sdfsdf',charset='sdfsdf')
可变参数3
----实参可以只传位置参数和关键字和未知参数两种方式一起传,仅传位置参数时,一定要和形参一一对应
mysql('192.168.1.1','root',port=3306,password='sdfsdf')
以下方式传值,会报错:
1、mysql('192.168.1.1','root',port=3306,password='sdfsdf')
输出错误:
TypeError: mysql() missing 3 required positional arguments: 'charset', 'sql', and 'db' # 缺少三个位置参数
2、mysql(password='123456','root')
SyntaxError: positional argument follows keyword argument # 位置参数需要和关键字参数一一对应
全局变量
特点:
1.字符串、int、floa、元组,更改全局变量需要先声明globa
2.全局变量一旦被修改,后续使用,都会用最新的值
3.列表list、字典dict、集合set,不用声明
name='小黑'
stus = []
def a():
global name #因为函数体内有一个变量name是字str类型,所以修改了全局变量时,要先在函数体内声明
stus.append('abc')
name = '哈哈哈'
print(name) #输出修改后的name=‘哈哈哈’
def b():
print('stus列表是:',stus) #这块stus是列表list类型,所以用到全部变量时,不用声明
print(name) # 输出修改后的name=‘哈哈哈’
a()
b()
输出结果:
哈哈哈
stus列表是: ['abc']
哈哈哈
def test():
global a
a = 5
def test1():
c = a + 5
return c
test() # 调用函数,输出全局变量a的值是5
res = test1()
print(res)
变量 深拷贝与浅拷贝
import copy # 导入copy模块
# 0 1 2 3
num1 = [1,1,2,3,4,5,6,7,7,8]
num2 = num1 #浅拷贝,在内存中,这两个变量分贝指定同一个内存地址
print(id(num1),id(num2)) # id方法函数,打印内存地址
num2 = copy.deepcopy(num1) #深拷贝,在内存中,分别指向不同的内存地址
print(id(num2),id(num1))
输出结果:
4357064968 4357064968
4357063240 4357064968
num1 = [1,1,2,3,4,5,6,7,7,8]
num2 = num1
for i in num2:
if i%2!=0:
num1.remove(i)
print(num1)
会导致输出:
[1, 2, 4, 6, 7, 8] #实际没把全部的基数去掉
解决方案:
分别定义两个列表,一个用来循环取值,一个用来删除。
num1 = [1,1,2,3,4,5,6,7,7,8]
num2 = [1,1,2,3,4,5,6,7,7,8]
for i in num2:
if i%2!=0:
num1.remove(i)
print(num1)
输出:
[2, 4, 6, 8]
函数 参数
def op_file(filename,content=None): # content参数是选传,可为空,可不为空
with open(filename,'a+',encoding='utf-8') as fw:
fw.seek(0)
if content:
fw.write(content)
else:
return fw.read()
op_file('a.txt',' ghjkl')
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('账号/密码错错误!')