Python之參數類型、變量


一、參數類型

(一)形參與實參

  • 要使用局部變量時,只能通過return的方式返回
def my(name):
   #函數體
   return name

my('lrx') 
#name是形參,lrx是實參
  • 不寫返回值的時候,返回的是None
def db_connect(ip,port=3306):
    print(ip,port)

res= db_connect('xxx.xx.xx.xx',3307)
print(res)
#結果:
#xxx.xx.xx.xx 3307
#None

(二)參數類型

1、位置參數\形式參數

  • 形式參數,也叫位置參數
  • 是必傳參數
  • 調用時如果不填實參會報錯
def my(name,sex): #name、sex是位置參數,調用時不填會報錯
    return name

my('lrx')
#結果:
#TypeError: my() missing 1 required positional argument
def db_connect(ip,user,password,db,port):
    pass
db_connect(user='lrx',ip='xxx.xx.xx.xx',port=3306,db='my1',password='123456')
db_connect('xx.xx.xx.xx','lrx',db='my1',password='123456',port=3306)
db_connect(ip='xx.xx.xx.xx','lrx',password='123456',db='my1',port=3306) #這樣寫報錯
#位置參數在傳參時,如果開頭指定了xx=xx,后面必須都有使用這種格式;如果開頭沒有指定,就按默認順序傳值
  • 給參數一個提醒類型:調用時可以傳入不同類型的參數,不受影響。
def my4(s:str,d:dict): #提示應該傳字符串類型和字典類型
    print(s)
    print(d)
my4(123,'sdf') #傳的是數字類型和字符串類型
#結果:
#123
#sdf
#結果不報錯,第一個是數字類型,第二個是字符串類型

2、默認值參數

  • xxx=xxx的格式
  • 是非必傳參數
  • 調用時不填,就使用定義時的默認值
def db_connect(ip,port=3306):
    print(ip,port)

db_connect('xxx.xx.xx.xx')
#結果:
#xxx.xx.xx.xx 3306
  • 調用時填,就使用填的值
def db_connect(ip,port=3306):
    print(ip,port)

db_connect('xxx.xx.xx.xx',3307)
#結果:
#xxx.xx.xx.xx 3307

3、可變參數

  • 是非必傳參數
  • 使用參數名前面加一個星號表示
  • 它把傳入的元素都存到一個元組里
  • 不限制傳入參數的個數
  • 用在參數比較多的時候
def send_sms(*phone_num): #*phone_num:可變參數,參數組
    print(phone_num)

send_sms()
send_sms('1')
send_sms('1','2','3')
#結果:
# ()
# ('1',)
# ('1', '2', '3')
  • 通常使用args作為參數名
def send_sms(*args): #*args:可變參數,參數組
    for p in args:
        print(p)

4、關鍵字參數

  •  是非必傳參數
  • 使用參數名前面加兩個星號表示
  • 不限制傳參個數
  • 它是把傳入的參數保存在一個字典里
  • 如果傳參,必須要傳位置參數這種xx=xx的格式,否則報錯。
  • 通常使用kwargs當做變量名。
def send_sms2(**kwargs):
    print(args)

send_sms2()
send_sms2(addr='sfsdf')
send_sms2(name='xiaohei',sex='')
#結果:
# {}
# {'addr': 'sfsdf'}
# {'name': 'xiaohei', 'sex': '男'}

5、參數組合使用

  • 如果一個函數中必須要使用4中參數,那么一定要按照順序寫參數:

        (1)位置參數(2)默認值參數(3)可變參數(4)關鍵字參數

def my(name,country='China',*args,**kwargs):
    print(name)
    print(country)
    print(args)
    print(kwargs)
my('xiaojun')
#結果:
# xiaojun
# China
# ()
# {}
def my(name,country='China',*args,**kwargs):
    print(name)
    print(country)
    print(args)
    print(kwargs)
my('xiaojun','Japan','beijing','天通苑',color='red',age=23)
#結果:
# xiaojun
# Japan
# ('beijing', '天通苑')
# {'age': 23, 'color': 'red'}
def my(name,country='China',*args,**kwargs):
    print(name)
    print(country)
    print(args)
    print(kwargs)
my('xiaojun')
my('xiaojun','beijing','天通苑',color='red',age=23)
#結果:
# xiaojun
# beijing
# ('天通苑',)
# {'age': 23, 'color': 'red'}
def my(name,country='China',*args,**kwargs):
    print(name)
    print(country)
    print(args)
    print(kwargs)
my('xiaojun',country='beijing','天通苑',color='red',age=23) #不可以,報錯,因為傳入了位置參數,后面就不能再直接傳參了,也要使用xx=xx的格式
def my(name,country='China',*args,**kwargs):
    print(name)
    print(country)
    print(args)
    print(kwargs)
my('xiaojun','beijing','天通苑',color='red',age=23,country='hh')
#結果:
#TypeError: my() got multiple values for argument 'country'
#由於前面已經給默認值參數賦值為beijing了,后面再賦值,代碼就不知道該怎么辦了。

 


return的作用:

  • 結束函數,只要函數里面遇到return就馬上結束。
  • 返回函數的處理結果。
def my2():
    for i in range(50):
        return i
print(my2())
#結果:
#0

變量賦值:

  • 多變量賦值為數值,單變量賦函數值為元組:
def my3():
    a=1
    b=2
    c=3
    return a,b,c

b,c,d=my3()
print(b,c,d)
s=my3()
print(s)
#結果:
#1 2 3
#(1, 2, 3)
  • 定義變量可以一起定義:
a,b,c=1,2,3

d=e=f=1

二、應用

1、操作文件:當不傳默認值時,讀文件,傳字典時,寫入json串。

import json
def op_file_tojson(file_name,dic=None):
    if dic:
        with open(file_name,'w',encoding='utf-8') as f:
            json.dump(dic,f)

    else:
        f=open(file_name,encoding='utf-8')
        f.seek(0)
        content=f.read()
        if content:
            res=json.loads(content.strip())
        else:
            res={}
        f.close()
        return res

op_file_tojson('users.txt',{"abc":"123","sgds":"3434"})
print(op_file_tojson('users.txt'))
#結果:
#{'abc': '123', 'sgds': '3434'}

三、局部變量與全局變量

  • 局部變量:只能在函數內部使用,如果外面想要使用,只能通過return的方式。
  • 全局變量:在文件里都可以使用,如果函數內部沒有定義該變量,函數內部需要使用時就使用全局變量。
name='lrx' #全局變量
def get_name():
    name='abc'
    print(name)
get_name()
#結果:
#abc

name='lrx' #全局變量
def get_name():
    #name='abc'
    print(name)
get_name()
#結果:
#lrx
  • 想要修改全局變量,就要在變量前面先聲明一下,使用global關鍵字
  • 只有string、int和元組才需要聲明
name='lrx'
def get_name():
    name='abc'
    print(name)
get_name()
print('函數外面的name',name)
#結果:
#abc
#函數外面的name lrx
 name='lrx'
def get_name():
    global name
    name='abc'
    print(name)
get_name()
print('函數外面的name',name)
#結果:
#abc
#函數外面的name abc

小練習:

name='lrx'
def get_name():
    global name
    name='abc'
    print('1、函數里面的name',name)
def get_name2():
    print('2、get_name2',name)
get_name2()
get_name()
print('3、函數外面的name',name)
#結果:
#2、get_name2 lrx
#1、函數里面的name abc
#3、函數外面的name abc

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM