1. 程式人生 > 其它 >python表示式生成式和常見內建函式

python表示式生成式和常見內建函式

python表示式生成式和常見內建函式

三元表示式

#使用場景:二選一的時候 推薦使用三元表示式

#尋常程式碼:
def index(a,b):
    if a>b:
        return a	# 如果a>b則輸出a
    else:
        return b	# 如果a<b則輸出b
    
   '不夠簡潔比較繁瑣'

三元表示式
    值1 if 條件 else 值2
條件如果成立則使用值1(if前面的資料)
條件如果不成立則使用值2(else後面的資料)

#程式碼示例:
def index(a,b):
    res = a if a > b else b
    print(res)
index(9,7)	# 9

'''三元表示式只用於二選一的情況 最好不要巢狀使用(語法不簡潔)'''

# 寫一個電影系統 需要決定電影是否收費
 is_change = input('是否收費>>>:').strip()
 is_free = '收費' if is_change == 'y' else '免費'
 print(is_free)
    
    # 針對if分支結構 也有簡化版本 (瞭解即可)
'''子程式碼塊都只有簡單的一行情況下 也可以簡寫  沒有三元表示式簡單 但是也有人用'''
name = 'jason'
if name == 'jason': print(name)
else: print('111')
    

各種生成式

列表生成式

#定義:
python裡面[]表示一個列表,快速生成一個列表可以用range()函式來生成。
對列表裡面的資料進行運算和操作,生成新的列表最高效快速的辦法,那就是列表生成式了

#迴圈程式碼:

 '對列表數平方'

b = range(1, 11)
c = []
for i in b:
    c.append(i*i)
print(c)

# 結果:[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

#列表生成式程式碼:

 '對列表數平方'

b = range(1, 11)
c = [x*x for x in b]
print(c)

# 結果:[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

列表生成式語法是固定的,[]裡面for 前面是對列表裡面資料的運算操作,後面跟平常for循序一樣遍歷去讀取。執行後會自動生成新的列表

#列表生成式還具備篩選功能

#程式碼示例:
name_list = ['jason', 'kevin', 'tony', 'oscar', 'jerry']
res = [name+'_SB' for name in name_list if name == 'jason']
print(res)
res = [name+'_SB' for name in name_list if name != 'jason']
print(res)

'''列表生成式中值允許出現for和if 不能出現else 因為會產生歧義(for和if都能結合else)'''

#多個引數:
a = [1, 2, 3, 4, 5]
b = ["a", "b", "c", "d", "e"]

# 多個引數列表生成式
c = [str(x)+str(y) for x, y in zip(b, a)]
print(c)

# 結果:['a1', 'b2', 'c3', 'd4', 'e5']

字典生成式

#定義:
通過生成式可以更加簡潔地生成字典

#程式碼示例:

l1 = ['a','b','c','d','e']
l2 = [1,2,3,4,5]
dict ={l1[i]:l2[i] for i in range(len(l1))}
print(dict)	

{'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5}


集合生成式

#定義:
通過生成式可以更加簡潔地生成集合

#程式碼示例:

res = {i for i in range(10)}
print(res, type(res))
res = {i for i in range(10) if i != 2}
print(res, type(res))

"""沒有元組生成式 依據上述寫法得到的時候後續我們要學習的知識:迭代器"""


匿名函式

#定義:
匿名函式就是不需要顯式的指定函式名

關鍵字lambda表示匿名函式,冒號前面的n表示函式引數,可以有多個引數。

匿名函式有個限制,就是隻能有一個表示式,不用寫return,返回值就是該表示式的結果

#匿名函式優勢:
因為函式沒有名字,不必擔心函式名衝突
此匿名函式也是一個函式物件,也可以把匿名函式賦值給一個變數,再利用變數來呼叫該函式

有些函式在程式碼中只用一次,而且函式體比較簡單,使用匿名函式可以減少程式碼量,看起來比較"優雅"
#這段程式碼

def calc(x,y):
    return x**y

#換成匿名函式

calc = lambda x,y:x**y
print(calc(2,5))


def calc(x,y):
    if x > y:
        return x*y
    else:
        return x / y
    
#三元運算換成匿名函式

calc = lambda x,y:x * y if x > y else x / y

print(calc(2,5)) # 0.4

print(calc(5,2)) # 10

示例二

info = {
    'Aason':9999999,
    'Jacob':123,
    'zark':1000,
    'berk':33
}
# 求:薪資最高的人的姓名
# print(max(info))  # zark
'''
max底層可以看成是for迴圈依次比較 針對字典預設只能獲取到k
獲取到k之後如果是字串的英文字母 則會按照ASCII碼錶轉成數字比較
    A~Z:65-90
    a~z:97-122
'''
def index(k):
    return info[k]
print(max(info,key=index))  # key對應的函式返回什麼 max就以什麼做比較的依據
# 比較的是v 返回的是k    key相當於是可以更改比較規則的引數

# 上述程式碼可以簡寫 因為函式功能很單一

print(max(info, key=lambda key:info[key]))  # Aason

常見重要內建函式

map函式

map()函式接收兩個引數,一個是函式,一個是Iterable,map將傳入的函式依次作用到序列的每個元素,並把結果作為新的Iterator返回

遍歷序列,對序列中每個元素進行函式操作,最終獲取新的序列
求列表[1,2,3,4,5,6,7,8,9],返回一個n*n 的列表

#程式碼示例:
li = [1,2,3,4,5,6,7,8,9]

res=map(lambda n:n*n,li)
print(list(res))

[1, 4, 9, 16, 25, 36, 49, 64, 81]

zip函式

#定義
將列表中的元素一一對應

#程式碼示例:
l1 = ['a','b','c','d','e']
l2 = [1,2,3,4,5]

print(list(zip(l1,l2)))
print(dict(zip(l1,l2)))

#輸出結果:
[('a', 1), ('b', 2), ('c', 3), ('d', 4), ('e', 5)]
{'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5}

'''zip可以整合多個數據集 如果資料集之間個數不一致 那麼依據短的'''


filter函式

#定義:
filter()也接收一個函式和一個序列
filter()把傳入的函式依次作用於每個元素
    True	'保留'
    False	'丟棄'
在一個列表中,刪掉偶數,只保留奇數
#程式碼示例
li = [1, 2, 4, 5, 6, 9, 10, 15]

res = filter(lambda x: x % 2 == 1, li)

print(list(res))	# [1, 5, 9, 15]

reduce函式

#定義:
reduce把一個函式作用在一個序列[x1, x2, x3, ...]上
這個函式必須接收兩個引數
reduce把結果繼續和序列的下一個元素做累積計算

reduce(func,[1,2,3]) 等同於 func(func(1,2),3)
一個列表的求和求積

#程式碼示例
from functools import reduce

li = [1,2,3,4,5,6,7,8,9]

res = reduce(lambda x,y:x*y,li)
res1 = reduce(lambda x,y:x+y,li)
print(res)	# 362880
print(res1)  # 45


其他常見內建函式

abs()函式

#abs()函式返回數字的絕對值

print( abs(-45) )                  # 返回 45

print("abs(0.2):",abs(0.2))        # 返回 abs(0.2): 0.2

all()函式any()函式

# all() 函式用於判斷給定的引數中的所有元素是否都為 TRUE

# any() 函式用於判斷給定的引數是否全部為False

l1 = [0, 0, 1, 0, True]
print(all(l1))  # False  

資料集中必須所有的元素對應的布林值為True返回的結果才是True

print(any(l1))  # True  

資料集中只要所有的元素對應的布林值有一個為True 返回的結果就是True

bin() oct() hex()函式

#產生對應的進位制數

print(bin(100))	# 0b1100100

print(oct(100))	# 0o144

print(hex(100))	# 0x64

bytes()函式

#型別轉換

'''針對編碼解碼 可以使用關鍵字encode與decode  也可以使用bytes和str'''

s1= 'hello 早上好'

# 編碼
res = bytes(s1, 'utf8')
print(res)	# b'hello \xe6\x97\xa9\xe4\xb8\x8a\xe5\xa5\xbd'

# 解碼
res1 = str(res, 'utf8')
print(res1)	# hello 早上好

divmod()函式

#函式把除數和餘數運算結果結合起來,返回一個包含商和餘數的元組(a // b, a % b)

print(divmod(250,25))  # (10, 0)  第一個引數是整數部分 第二個是餘數部分
print(divmod(251,25))  # (10, 1)
print(divmod(249,25))  # (9, 24)


"""
可以使用在網站的分頁製作上
    問
        總共250條資料 每頁展示25條 需要多少頁   10頁
        總共251條資料 每頁展示25條 需要多少頁   11頁
        總共249條資料 每頁展示25條 需要多少頁   10頁
"""
def get_page_num(total_num,page_num):  # 後面django分頁器使用
     more,others = divmod(total_num, page_num)
     if others:
         more += 1
     print('需要%s頁'%more)
 get_page_num(1000,30)

callable()函式

#判斷當前物件是否可以加括號呼叫

name = 'jason'
def index():pass
print(callable(name))  # False  變數名不能加括號呼叫

print(callable(index))  # True  函式名可以加括號呼叫

chr()函式ord()函式

#字元與數字的對應轉換

print(chr(65))  # A  根據數字轉字元  依據ASCII碼
print(ord('A'))  # 65  根據字元轉數字  依據ASCII碼

enumerate()函式

#enumerate() 函式用於將一個可遍歷的資料物件(如列表、元組或字串)組合為一個索引序列,同時列出資料和資料下標
		'一般用在 for 迴圈當中'

#程式碼示例:    
name_list = ['jason', 'kevin', 'oscar', 'tony']
for name in name_list:
    print(name)

for i,j in enumerate(name_list):
    print(i,j)  # i類似於是計數 預設從0開始

for i,j in enumerate(name_list,start=1):
    print(i,j)  # 還可以控制起始位置

dir()函式

#返回資料型別可以呼叫的內建方法(檢視物件內部可呼叫的屬性)

print(dir(123))
print(dir('jason'))

eval() 函式 exec() 函式

#eval() 函式用來執行一個字串表示式,並返回表示式的值

#exec() 執行儲存在字串或檔案中的Python語句
'能夠識別具有與一定邏輯的python程式碼'

eval("print('Hello World')")        # 執行簡單的字串

exec("for i in range(5): print('iter time is %d'%i)")      # 執行復雜的for迴圈
# iter time is 0
# iter time is 1
# iter time is 2
# iter time is 3
# iter time is 4