Day5_pyhton基础<参数、函数、全局变量>

关键字参数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','\nghjkl')

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('账号/密码错错误!')



 

posted @ 2018-12-02 23:00  维也纳729  阅读(201)  评论(0编辑  收藏  举报