1. 異常
????運行程序的時候程序報錯,又叫程序出現(xiàn)異常;
????當執(zhí)行程序的時候如果出現(xiàn)異常,出現(xiàn)異常的線程會直接奔潰,不再執(zhí)行線程中后面其他的代碼
2. 異常捕獲
2.1 語法一: 可以捕獲任何類型的異常
????try:
????????代碼塊1
????except:
????????代碼塊2
????finally:
????????代碼塊3
????其他語句
說明:
????try,except - 關鍵字亿胸,固定寫法
????代碼塊1 - 和try保持一個縮進的一條或者多條語句;
????????????????????需要捕獲異常的代碼
????代碼塊2 - 和except保持一個縮進的一條或者多條語句
????????????????????異常發(fā)生后會執(zhí)行的代碼
執(zhí)行過程:
????先執(zhí)行代碼塊1,如果在執(zhí)行代碼塊1的時候出現(xiàn)了異常外邓,程序不崩潰,直接執(zhí)行代碼塊2古掏,然后再執(zhí)行后面的其他語句损话;如果在執(zhí)行代碼塊1的時候沒有出現(xiàn)異常,代碼塊2不會執(zhí)行槽唾,直接執(zhí)行后面的其他語句丧枪。
try:
print({'a': 10}['b']) # KeyError: 'b'
print('++++++')
list1 = [1, 2, 3]
print(list1[10])
print('=======')
except:
print('出現(xiàn)異常!')
# name = input('姓名:')
# try:
# age = int(input('年齡:'))
# except:
# print('輸入有誤!年齡只能是數(shù)字!')
2.2 語法二: 捕獲指定異常
????try:
????????代碼塊1
????except 異常類型:
????????代碼塊2
????finally:
????????代碼塊3
執(zhí)行過程:
????先執(zhí)行代碼塊1, 如果執(zhí)行代碼塊1的時候出現(xiàn)異常庞萍,檢查異常類型和except后面的異常類型是否一致拧烦,如果一致程序不崩潰,直接執(zhí)行代碼塊2钝计;如果不一致恋博,程序直接崩潰齐佳;如果執(zhí)行代碼塊1的時候沒有出現(xiàn)異常,不執(zhí)行代碼塊2债沮,接著往后執(zhí)行炼吴。
print('========================')
try:
print({'a': 1}['b'])
print('+++++')
print([1, 2, 3][10])
print('======')
except KeyError:
print('key值錯誤!')
2.3 語法三: 同時捕獲指定多個異常
????try:
????????代碼塊1
????except (異常類型1, 異常類型2,...):
????????代碼塊2
????finally:
????????代碼塊3
2.4 語法四: 同時捕獲指定多個異常
????try:
????????代碼塊1
????except 異常類型1:
????????代碼塊11
????except 異常類型2:
????????代碼塊22
????...
????finally:
????????代碼塊3
2.5 finally關鍵字
????前面四種捕獲異常的結構的最后都可以添加一個finally;finally后面的代碼段一定會執(zhí)行。
????try:
????????代碼塊1
????except:
????????代碼塊2
????finally:
????????代碼塊3
????其他語句
try:
# print({'a': 10}['b'])
print('=====')
print([1, 2, 3][10])
except IndexError:
print('錯誤! 下標越界!')
finally:
print('寫遺書!')
print('其他語句')
2.6 拋出異常
????主動讓程序奔潰
語法:
????raise 異常類型
說明:
????異常類型必須是Exception的子類
# raise ValueError
class AgeError(Exception):
def __str__(self):
return '年齡值范圍不在0~150'
age = 1000
if not 0 <= age <= 150:
raise AgeError
3. 什么是模塊
????python中一個py文件就是一個模塊
3.1 怎么一個模塊中使用另外一個模塊中的內容
????如果要在一個模塊中去使用另外一個模塊中的內容疫衩,必須先導入模塊
語法:
a.import 模塊名 - 導入指定模塊硅蹦,導入后可以在當前模塊中使用模塊中所有的全局變量,以'模塊名.全局變量名'的方式去使用
b.from 模塊名 import 變量名1,變量名2,... - 導入指定模塊隧土,導入后只能使用import后面指定的變量,導入后指定的全局變量在當前模塊中直接使用提针,不用在前面加'模塊名.'
c.from 模塊名 import * - 導入指定模塊,導入后可以在當前模塊中使用模塊中所有的全局變量;導入后全局變量直接使用曹傀,不用加'模塊名.'
d.import 模塊名 as 新模塊名 - 導入后采用新模塊名去使用模塊中的內容
e.from 模塊名 import 變量名1 as 新變量名1, 變量名2 as 新變量名2,...
# 導入方式一:
import test
print(test.test_a, test.test_str1)
test.func1()
# 導入方式二:
from test import test_a, func1
print(test_a)
func1()
print(test_str1) # NameError: name 'test_str1' is not defined
# 導入方式三:
from test import *
print(test_a, test_str1)
func1()
#模塊重命名:
import fileManager as FM
FM.write_file(900)
FM.json_read()
import time as TIME
time = 10
print(TIME.sleep(1), time)
from test import a as ta
a = 100
print(a, ta)
3.2 導入模塊的原理
????當執(zhí)行導入模塊的代碼的時候,會直接執(zhí)行被導入的模塊中所有的代碼
a.重復導入問題
????import在導入模塊的時候會自動檢測這個模塊之前是否已經導入過,來避免一個模塊的重復導入
b.阻止模塊中的內容被其他模塊導入
????將不需要被其他模塊執(zhí)行的語句寫入"if name == 'main':"對應的if語句中
import test2
print('04:', __name__)
4. 什么是包
????一個帶有init.py文件的文件夾就叫包
4.1 直接導入包 - 只執(zhí)行init.py文件
import pygame
# import animal
# print(animal.bird.b)
# print(animal.type)
# animal.fly()
from animal import fly
fly()
# 2.從包中導入指定的模塊
# from animal import bird, dog, cat
# print(bird.b, dog.d, cat.c)
# 3.從包中的模塊導入變量
# from animal.cat import c
# print(c)
import time
import os
import sys
import hashlib
"2019/8/7 16:07:23"
print(time.time())
print(sys.version)
# print(sys.exit())
print(sys.maxsize)
print(sys.path)
5. 加密
????hashlib是python3.x提供的一個hash加密的模塊: 支持目前主流一些加密算: sha256饲宛、md5等
5.1 hash加密特點:
a. 相等的數(shù)據(jù)采用同一個加密算法皆愉,保證加密結果一樣
b. 通過加密后的數(shù)據(jù)不能反向獲取原數(shù)據(jù)
c. 采用同樣的加密算法,不管原數(shù)據(jù)的大小是多少艇抠,加密后的數(shù)據(jù)的長度是一樣的
pw = input('請輸入密碼:')
# 2.加密步驟
# 1)根據(jù)加密算法創(chuàng)建hash對象
hash = hashlib.md5()
# 2)對數(shù)據(jù)進行加密
# hash對象.update(加密數(shù)據(jù)) - 加密數(shù)據(jù)必須是二進制數(shù)據(jù)
# 字符串轉二進制: a.字符串.encode(encoding='utf-8') b. bytes(字符串, encoding='utf-8')
# hash.update('你好!'.encode())
hash.update(pw.encode())
# 3)根據(jù)hash對象獲取加密后的數(shù)據(jù)(字符串類型)
result = hash.hexdigest()
# sha256:8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92
# sha256:8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92
# sha1: 7c4a8d09ca3762af61e59520943dc26494f8941b
# md5: e10adc3949ba59abbe56e057f20f883e
# sha256:0d6fe5a72b9f458fb117050549f96fad9c83f21e2fb8267e3402a5ac0a2773ce
# sha256:292641079fc2e9f736a577ba36d47291b99ac3bc8d9d133ea6b2f9b4173a3832
print(result)
# d3ecf18ba4bcb13e03ed25dee7d94870