Python-全局變量和局部變量&函數&遞歸&深淺拷貝

1.全局變量和局部變量python

money = 10  # 全局變量

def func(): num = 'num'  # 局部變量
    global money money += 500
    print(num + money) ''' global money # 在局部變量中想修改全局變量,須要用global聲明你要修改的是全局變量 全局列表、字典、集合在修改時,不用聲明全局變量,能夠直接修改 全局int、str、tuple(元組)在修改時,須要先聲明爲全局變量 便可變類型的全局變量在修改時,不用聲明全局變量,能夠直接修改;不可變類型,須要聲明(元組元素不能修改) '''

 

2.函數定義mysql

def test1():  # 定義一個函數
    pass  # 表示沒有函數體,直接過


def test2(a, b):  # 定義一個有參的函數
    return a  # 函數返回值

 

3.函數參數sql

# 一、必填參數(位置參數)
def say_word(word): print(word)
# 二、默認值參數:能夠不傳參數,不傳參數的時候使用默認值,傳了參數時使用所傳參數 # (使用默認值參數能夠實現一個函數實現多個功能,例如一個函數實現讀和寫兩個功能)
def say_hello(word='hello'):  # 默認值參數
    print(word)
# 三、參數組(可變參數):不限制參數的類型和數量
def send_mail(*args):  # 此時args是元組類型,名稱可改(例如:*name),習慣上使用args
    for name in args: print('給%s發郵件' % name) return args send_mail() send_mail('zhangsan') send_mail('zhangsan', 'lisi', 'wangwu')
# 四、關鍵字傳參:形參較多時,可使用關鍵字傳參,參數能夠不用按照順序傳參
''' 調用參數時,能夠所有使用位置參數,位置一一對應,必須按照位置傳參 也能夠所有使用關鍵字傳參,指定關鍵字,就不須要按照順序傳參 也能夠位置參數和關鍵字參數一塊兒使用,但要先寫位置參數在用關鍵字參數,關鍵字參數後面不能再使用位置參數 '''
def szz(name, age, sex, addr, phone): print('111') szz(sex='man', name='zhangsan', addr='beijing', age=18, phone='13565243526')  # 使用關鍵字參數
szz('zhangsan', 18, sex='man', addr='beijing', phone='13565243526')  # 位置參數和關鍵字參數混合使用

# 以下,是否傳參不限制,參數類型和數量不限制,可是隻能使用關鍵字參數,不能使用位置參數
def name(**kwargs):  # 關鍵字傳參,此時kwargs是字典類型,名稱可改(例如:**name),習慣上使用kwargs
    print(kwargs) name() name(name='zhangsan', age='18', phone='1234') name(name='zhangsan', age='18', phone='1234', addr='beijing')
# 指定參數類型
def add_user(username: str, passwd: int):  # 指定傳入參數類型,傳入參數時,也能夠不傳入指定類型
 username.strip() print(passwd)
# 參數練習1:
def student(name, age=None, *args, **kwargs): print(name)  # 位置參數
    print(age)  # 默認參數
    print(args)  # 參數組
    print(kwargs)  # 關鍵字參數
 student('zhangsan', 18, 'lisi', 'wangwu', sex='man', phone='123')
# 參數練習2:
def db_mysql(host, port, user, passwd, db): print(host) print(port) print(user) print(passwd) print(db) db_info1 = ('127.0.0.1', 3306, 'root', '1234567', 'szz') db_info2 = { 'host': '127.0.0.1', 'port': 3306, 'user': 'root', 'passwd': '1234567', 'db': 'szz', } db_mysql(*db_info1) db_mysql(**db_info2) # * 表明拆開db_info1(解包),將db_info1中的元素與參數意義對應,但db_info1中的元素不能多於參數數量,且位置需與參數位置對應 # db_info1只要是有下標的數據類型便可,例如列表,元組,字符串等 # ** 表明拆開db_info2字典(解包),將db_info2中的元素與參數意義對應,但db_info2中的元素不能多於參數數量,且key的位置需與參數位置對應

 

4.函數返回值數組

# return的做用:1.返回函數值 2.結束函數 # 返回多個值,用一個變量接收,那麼會將多個返回值放入一個元組中進行返回
def get_file(age, name, addr): age += 5 name = 'szz' + name addr = 'beijing' + addr return age, name, addr res = get_file(19, 'xiaohei', 'chaoyang')  # 多個返回值使用一個變量接收
age, name, addr = get_file(19, 'xiaohei', 'chaoyang')  # 多個返回值使用多個變量接收
print(res)  # 打印出的會是一個元組

 

5.遞歸函數

# 遞歸:函數本身調用本身,最大次數調用999次
def say(): num = input('請輸入一個數字:').strip() if int(num) % 2 != 0: print('請輸入一個偶數') say() say()
# 練習:
li = [1, 1, 2, 3, 4, 5, 6, 7, 8, 9] for i in li: if i % 2 != 0: li.remove(i) print(li)  # 結果爲:[1, 2, 4, 6, 8] # 緣由是,循環刪除列表元素時,再次循環,列表元素會更新

# 解決方法以下:
l1 = [1, 1, 2, 3, 4, 5, 6, 7, 8, 9] l2 = [1, 1, 2, 3, 4, 5, 6, 7, 8, 9]  # 不能寫成l2=l1,由於變量存儲時是存的內存地址,l2=l1時,l1和l2內存地址相同

# 寫法2:l2 = l1[:]
for i in l2: if i % 2 != 0: l1.remove(i) print(l1) print(id(l1)) print(id(l2))  # 查看內存地址

 

6.深拷貝和淺拷貝spa

# 深拷貝
l1 = [1, 1, 2, 3, 4, 5, 6, 7, 8, 9] l2 = l1[:]  # 開闢了新的內存空間,兩個變量之間互不影響 # 淺拷貝
l2 = l1  # 未開闢新的內存空間,兩個變量之間會被互相影響 # 深拷貝和淺拷貝的區別,淺拷貝不會開闢新的內存空間,深拷貝會開闢新的內存空間

import copy # 導入copy模塊
d = {'name': 'zhangsan', 'age': [12, 1, 14]} d1 = d  # 淺拷貝
d2 = copy.deepcopy(d)  # 深拷貝函數
d3 = copy.copy(d)  # 淺拷貝,可是d和d3的內存地址不一樣,但若d中存在多層(例如列表元素),則不會拷貝深層的內容

 

7.內置函數code

input() # 輸入
tuple() # 元組
bool # 布爾
dict() # 字典
list() # 列表
len() # 求長度
sum([1, 2, 3]) # 求和
max([1, 2, 3]) # 求最大值
min([1, 2, 3]) # 求最小值
round(1.98234, 2)  # 取幾位小數(將1.98234保留兩位小數)
divmod(10, 5)  # 取商和餘數
globals()  # 用於全局時,取當前文件中的全部變量;用於局部時,依然取當前文件的全部變量
locals()  # 用於全局時,取當前文件中的全部變量;用於局部時,取局部的全部變量
chr(55)  # 將ascii轉成對應的字符
ord('A')  # 將字符轉成對應的ascii
dir(d)  # 查看d中有哪些方法
# 排序
sorted(l)  # 對l進行排序,l能夠是list、字符串等,排序後會返回一個list,升序
sorted(l, reverse=True)  # 降序排序

# 執行python代碼
code = ''' print('1') '''
exec(code)  # 運行python代碼
eval(code)  # 執行簡單的python代碼

# 枚舉 enumerate
l = [1, 2, 3, 4, 5] for id, i in enumerate(l, 1):  # 將l列表中的元素從1開始,自動編號
    print('%s=>%s' % (id, i))
# 壓縮
zip()  # 壓縮,將多個列表合在一塊兒;不限制於列表,對字典使用時,只合並兩個字典的key值;若一列表元素多餘另外一元素,則以少的爲準
list1 = ['xiaoming', 'xiaobai', 'xiaohei', 'zhangsan'] list2 = [1, 2, 3, 4, 5] l1 = {'name': 1, 'age': 2} l2 = {'add': 3, 'phone': 4} res = list(zip(l1, l2)) res1 = list(zip(list1, list2)) print(res) print(res1) # 循環調用
import os list(map(os.mkdir, ['1', '2', '3'])) # 循環調用函數,獲取函數返回結果;表示循環列表中的值調用os.mkdir函數,注意函數不加括號,後面只要是能夠循環的便可 # map(os.mkdir,['1','2','3'])直接這樣寫不會調用即不會真的執行,需強轉
 score = [89, 43, 60, 52, 45, 37, 66, 100, 21, 24] def is_jg(s): if s > 59: return True result = list(filter(is_jg, score)) # 循環調用函數,將返回True的保存,不然過濾
相關文章
相關標籤/搜索