Python-匿名函數與異常處理

匿名函數

什麼叫匿名函數?

咱們以前學過的叫有名函數,就是有名字的函數編程

匿名函數 就是沒有名字的函數,函數

語法

lambda 參數:返回值ui

# 演示匿名函數的使用

f = lambda x:x
print(f)
# <function <lambda> at 0x00000000005D1E18>
s = f(1)        # 注意 ,匿名函數調用拿到的是返回值。
print(s)
# 1

匿名函數通常與python內置方法連用。code

max/min()

'''
用法:
max(可迭代對象,匿名函數)
返回最大值
'''
好比說咱們想要求出如下字典的最高/最低薪資的人的名字

salary_dict = {
    'nick': 3000,
    'jason': 100000,
    'tank': 5000,
    'sean': 2000
}
print(max(salary_dict))     # 若是直接用max函數的話會按照字符串首字母順序來排序
# tank

# 咱們能夠定義一個函數
def func(k):
    return salary_dict[k]
print(min(salary_dict,key=func))     
# sean
print(max(salary_dict,key=func))
# jason
'''
key=func  作的事情:
1. 循環salary_dict 取出全部的key值
2. 將每一個key值放入func函數中,返回values,返回薪資
3. max函數進行排序
'''

# 用匿名函數實現
print(max(salary_dict,key=lambda name:salary_dict[name]))
# jason
print(min(salary_dict,key=lambda name:salary_dict[name]))
# sean

sorted()

'''
sorted(可迭代對象,reverse)
sorted,排序,返回值找一個變量接收
'''
lis = [1, 3, 2, 5, 8, 6]
lis = sorted(lis,reverse=True)      # reverse=True 反轉
print(lis)
# [8, 6, 5, 3, 2, 1]

salary_dict = {
    'nick': 3000,
    'jason': 100000,
    'tank': 5000,
    'sean': 2000
}
def f2(item):
    return salary_dict[item]
res = sorted(salary_dict,key=f2,reverse=True)
print(res)
# ['jason', 'tank', 'nick', 'sean']

# 用匿名函數實現
res = sorted(salary_dict,key=lambda item:salary_dict[item],reverse=True)
print(res)
# ['jason', 'tank', 'nick', 'sean']

map()

'''
map(匿名函數,可迭代對象)
映射
'''

name_list = ['jason', 'tank', 'sean']

def f1(item):
    return item + "hahahhahahhahahhaha"
res = map(f1,name_list)
print(list(res))
# ['jasonhahahhahahhahahhaha', 'tankhahahhahahhahahhaha', 'seanhahahhahahhahahhaha']

# 匿名函數實現
res = map(lambda name:f"{name} sb",name_list)
print(list(res))
# ['jason sb', 'tank sb', 'sean sb']

filter()

'''
filter(匿名函數,可迭代對象)
篩選,按照某種條件對可迭代對象操做。
'''
name_list = ['nick', 'jason sb', 'tank sb', 'sean sb']

# 匿名函數實現
res = filter(lambda name:name.endswith("sb"),name_list)
print(list(res))
# ['jason sb', 'tank sb', 'sean sb']

lis = [2,3,4,5,6,7]
def function(item):
    if item > 5:
        return True
    else:
        return False
res = filter(function,lis)
print(list(res))
# [6, 7]

# 匿名函數實現
res = filter(lambda item:item > 5,lis)
print(list(res))
# [6, 7]

reduce函數

from functools import reduce
lst=[1,2,3,4]
print(reduce(lambda x,y: x+y, lst))

#計算過程以下:
# 這個式子只有兩個參數,沒有初始化值,那麼就取列表前2項,經過lambda函數計算結果
#1+2=3,
#上面計算的結果在與列表第三個元素經過lambda函數計算
# 3+3=6
#上面計算的結果在與列表第四個元素經過lambda函數計算
# 6+4=10

# 它還能夠傳入一個參數
print(reduce(lambda x,y: x+y, lst,100))
# 表示初始值是100,第一次計算從100加列表的第一個元素,獲得的結果再與後面的值依次相加

內置函數

## 須要掌握

1.bytes() # 解碼字符
res = bytes("你好" ,encoding="utf8")  # 解碼成二進制
print(res)

'''
2.chr()/ord()
按照ascil碼 將數字轉換爲對應字符
ord 將字符轉換爲數字
'''
print(chr(65))
print(ord("A"))

'''
3.divmod()
將商 餘數以元組形式返回
'''
print(divmod(10,3))

'''
4.ennumerate()  ********************重要
帶有索引的值
'''
l = ["a","b","c"]
for i in enumerate(l):
    print(i)
# (0, 'a')
# (1, 'b')
# (2, 'c')

'''
5.eval()    ********************重要
將字符串兩邊的引號去掉,變成剩下的數據類型
'''
lis = "[1,2,3]"
print(type(list))
# <class 'type'>
print(type(eval(lis)))
# <class 'list'>

'''
6.hash()
是否可哈希
'''
print(hash(10))
# 10

##############################################################################################

## 瞭解
'''
1. abs()    ***
求絕對值
'''
print(abs(-1))
# 1

'''
2. all()
可迭代對象內元素全爲真則返回真
'''
print(all([1,2,3]))
# True

'''
3. any()
可迭代對象內有一元素爲真,則爲真
'''
print(any([1,2,3,0]))
# True

'''
4. bin()
    oct()
    hex()
    二進制、八進制、十六進制轉換
'''
print(bin(17))
print(oct(17))
print(hex(17))
# 0b10001
# 0o21
# 0x11

'''
5. dir()
列出全部time的功能
'''
print(dir())
# ['__annotations__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__',
#  '__name__', '__package__', '__spec__', 'i', 'l', 'lis', 'res']

'''
6. frozenset()
不可變的集合
'''
set8 = frozenset({1,2,3,4,5})
print(set8)
# frozenset({1, 2, 3, 4, 5})
# set8.add(10)
# AttributeError: 'frozenset' object has no attribute 'add'

'''
7. globals()
loacals()
查看全局、局部名字
'''
def func():
    a = 1
    # print(locals())   # 以字典形式返回
    # print(globals())    # 打印全局名字
func()
# {'a': 1}
# {'__name__': '__main__', '__doc__': '\n1.bytes()\n解碼字符\n', '__package__': None, '
# __loader__': <_frozen_importlib_external.SourceFileLoader object at 0x0000000001DCB208>,
#  '__spec__': None, '__annotations__': {},
# '__builtins__': <module 'builtins' (built-in)>,
# '__file__': 'C:/Users/Administrator/Desktop/老男孩python文檔/老男孩Python程序編寫/練習/第三章Python基礎--文件操做&函數/內置函數.py', '__cached__': None, 'res': b'\xe4\xbd\xa0\xe5\xa5\xbd', 'l': ['a', 'b', 'c'], 'i': (2, 'c'), 'lis': '[1,2,3]', 'set8': frozenset({1, 2, 3, 4, 5}), 'func': <function func at 0x00000000004F1E18>}

'''
8. pow()
返回 xy(x的y次方) 的值。
'''
print(pow(5,2))
# 25

'''
9. round()  ***
返回浮點數x的四捨五入值。
'''
print(round(5.1))
# 5

'''
10. slice()
切片對象,主要用在切片操做函數裏的參數傳遞。
slice 語法:
class slice(stop)
class slice(start, stop[, step])
'''
myslice = slice(5)
print(myslice)

'''
11. sum()   ***
進行求和計算
'''
print(sum(range(100)))
# 4950

'''
12. __import__()
經過字符串導入模塊
'''
m = __import__("time")
print(m.time())
# 1569325150.957757

'''
面向對象函數,-----^_^-----
classmethod
staticmethod
property
delattr
hasattr
getattr
setattr
isinstance()
issubclass()
object()
super()
'''

面向過程編程

什麼叫面向過程,面向 流程 編程對象

面向過程編程是解決問題的一種思想,過程是解決問題的步驟blog

將複雜的問題拆解成一個個流程,從而作完整個事情排序

優勢:複雜的問題流程化,簡單化索引

缺點:擴展性差接口

'''
註冊功能
接受用戶輸入用戶名,進行合法性校驗,拿到合法的用戶名
'''
def check_user():
    username = input(">>>").strip()
    if username.isalpha():
        return username
    else:
        print("用戶名必須爲字母,傻逼")

'''
分層實現功能
用戶功能層:實現用戶具體的功能
接口層:鏈接數據處理層和用戶功能層
數據處理層:處理數據後把結果交給接口層
'''

異常處理

什麼是異常

異常就是程序運行時候的報錯

異常的種類

在python中不一樣的異常是不一樣的類型,一個異常標識一種錯誤

異常處理

try:
    代碼
except 錯誤類型:
    代碼
print(1)
num = input('請輸入數字:')
dic = {'a': 1}

try:
    print(dic['b'])     # KeyError
    1 / int(num)        # 報錯以後,不運行下面的代碼
except ZeroDivisionError:
    print('傻逼,不能輸入0')
except KeyError:
    print('傻逼,不知道什麼錯誤')

print(2)
# 萬能捕捉異常

print(1)
num = input('請輸入數字:')
dic = {'a': 1}
try:
    print(dic['b'])     # KeyError
    1 / int(num)    # 報錯以後,不運行下面的代碼
except Exception as e:      # 萬能異常,只要有錯誤,就捕捉
    print(e)    # 打印錯誤的描述信息
    print('傻逼,不知道什麼錯誤')
print(2)

try...except總結

  1. 把錯誤處理和真正的工做分開
  2. 代碼更加清晰,複雜的工做任務更容易實現
  3. 代碼更加有健壯性

finally語句

finally 表示不管報不報錯都執行下面的代碼

# 異常捕捉只能捕捉邏輯錯誤
fr = open('test.py')
try:
    # 文件中途報錯
    1 / 0
except Exception as e:
    print(e)
finally:    # 不管你報不報錯,都執行這一行
    print('finally')
    fr.close()

主動拋出異常raise

try:
    raise TypeError('拋出異常,類型錯誤')
except Exception as e:
    print(e)

斷言assert

assert 1 == 1

try:
    assert 1 == 2
except Exception as e:
    print(e)
相關文章
相關標籤/搜索