python基礎

小郑[努力版]發表於2024-07-07

Python基礎

一、前序

  1. 檢視Python版本

    pyhton -V 或 Python --version

二、基礎部分

2.1 基礎語法

  1. 編碼

    預設情況下,Python 3 原始碼檔案以 UTF-8 編碼,所有字串都是 unicode 字串。 當然你也可以為原始碼檔案指定不同的編碼:

    # -*- coding: cp-1252 -*-
    
  2. 識別符號

    • 第一個字元必須是字母或下劃線
    • 識別符號的其他部分由字母,數字和下劃線組成
    • 識別符號對大小寫敏感
  3. python保留字

    >>> import keyword
    >>> keyword.kwlist
    ['False', 'None', 'True', 'and', 'as', 'assert', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'nonlocal', 'not', 'or', 'pass', 'raise', 'return', 'try', 'while', 'with', 'yield']
    

2.2 基本資料型別

標準資料型別

  • Number 數字
  • String 字串
  • bool 布林型別
  • List 列表
  • Tuple 元組
  • Set 集合
  • Dictionary 字典

python3中六個標準資料型別中:

  • 不可變資料(3個):Number String Tuple
  • 可變資料(3個): List Dictionary Set

3.2.1 Number 數字

支援 int、float、bool、complex

內建的type()函式可以用來查詢變數所指的物件型別

isinstance和type的區別:

  • type()不會認為子類是一種父類型別
  • isinstance()會認為子類時一種父類型別

3.2.2 String 字串

字串擷取的語法如下:

變數[頭下表 : 尾下標]

  • 反斜槓可以用來轉義,使用r可以讓反斜槓不發生轉義
  • Python中的字串有兩種索引方式,從左往右以0開始,從右往左以-1開始
  • Python中的字串不能改變

3.2.3 bool 布林型別

  • 布林型別只有兩個值:True 和 False。
  • bool 是 int 的子類,因此布林值可以被看作整數來使用,其中 True 等價於 1。
  • 布林型別可以和其他資料型別進行比較,比如數字、字串等。在比較時,Python 會將 True 視為 1,False 視為 0。
  • 布林型別可以和邏輯運算子一起使用,包括 and、or 和 not。這些運算子可以用來組合多個布林表示式,生成一個新的布林值。

3.2.4 列表

更新列表

list1 = ['Google', 'Runoob', 'Taobao']
list1.append('Baidu')

刪除列表

使用del語句來刪除列表中的元素:

#!/usr/bin/python3
 
list = ['Google', 'Runoob', 1997, 2000]
 
print ("原始列表 : ", list)
del list[2]
print ("刪除第三個元素 : ", list)

列表常用方法

  • len(list) 列表元素個數
  • list(seq) 將元組轉換為列表
  • list.count(obj) 統計某個元素在列表中出現的次數
  • list.append(obj) 在列表中末尾新增新的物件
  • list.extend(seq) 在列表末尾一次性追加另一個序列中的多個值
  • list.insert(obj) 從列表中找出某個值第一個匹配項的索引位置
  • list.insert(index,obj) 將物件插入列表

三、異常

使用try-catch處理

try:
    #[程式碼塊A] 可能會出現異常的程式碼
except  Exception1 [as 2]:
    # 異常處理
.....
[else:]
	# 可選,如果沒有引發異常會執行
[finally:]
	# 無論如何都要執行的語句
    # 資料的清楚,檔案流的關閉等操作

raise關鍵字

try:
    pwd = input('請輸入您的密碼:')
    if len(pwd) < 8:
        raise Exception('密碼長度不夠,請輸入一個8位以上的密碼')
except Exception as e:
    print(e) # 密碼長度不夠,請輸入一個8位以上的密碼

當能預期到可能出現異常時選擇捕獲異常,否則丟擲異常

四、模組

使用import匯入

from 模組名 import 方法名  as 別名

每一個副檔名py結尾的python原始檔都是一個模組

在模組中定義的全域性變數,函式都是模組能夠提供給外界使用的工具

  1. 包的使用

    包是python模組的一種組織形式,將多個模組組合在一起,形成了一個大的python工具庫。包通常是一個擁有__init__.py檔案的目錄,它定義了包的屬性和方法。

    import  pack1.module1
    from pack1 import module1
    
  2. 常見的標準庫

  3. time庫

    • 獲取當前時間

      • time.time(): 返回自紀元(1970年1月1日00:00:00 UTC)以來的秒數,通常稱為Unix時間戳。

      • time.localtime(): 返回一個表示本地時間的time.struct_time物件。

      • time.gmtime(): 返回一個表示協調世界時(UTC)的time.struct_time物件。

        import time
        
        # 獲取當前時間戳
        timestamp = time.time()
        print("當前時間戳:", timestamp)
        
        # 獲取本地時間
        local_time = time.localtime()
        print("本地時間:", local_time)
        
        # 獲取UTC時間
        utc_time = time.gmtime()
        print("UTC時間:", utc_time)
        
        
        #當前時間戳: 1715833304.1631322
        #本地時間: time.struct_time(tm_year=2024, tm_mon=5, tm_mday=16, tm_hour=12, tm_min=21, tm_sec=44, tm_wday=3, tm_yday=137, tm_isdst=0)
        #UTC時間: time.struct_time(tm_year=2024, tm_mon=5, tm_mday=16, tm_hour=4, tm_min=21, tm_sec=44, tm_wday=3, tm_yday=137, tm_isdst=0)
        
    • 時間格式化

      • time.strftime(format, time_tuple): 將time.struct_time物件格式化為字串。

      • time.strptime(string, format): 將字串解析為time.struct_time物件。

        import time
        
        # 格式化本地時間
        formatted_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
        print("格式化後的本地時間:", formatted_time)
        
        # 解析時間字串
        parsed_time = time.strptime("2021-09-10 10:22:47", "%Y-%m-%d %H:%M:%S")
        print("解析後的時間:", parsed_time)
        
        #格式化後的本地時間: 2024-05-16 12:22:02
        #解析後的時間: time.struct_time(tm_year=2021, tm_mon=9, tm_mday=10, tm_hour=10, tm_min=22, tm_sec=47, tm_wday=4, tm_yday=253, tm_isdst=-1)
        
    • 延時執行

      • time.sleep(seconds): 使程式暫停指定的秒數。

        import time
        
        print("開始休眠...")
        time.sleep(2)  # 休眠2秒
        print("休眠結束!")
        
    • 定時器(每隔一定時間執行一次任務)

      使用 time.sleep() 和一個迴圈來建立一個簡單的定時器。

      import time
      
      def timer_task():
          print("定時任務執行中...")
      
      while True:
          timer_task()
          time.sleep(5)  # 每5秒執行一次
      
      # 注意:上面的程式碼會無限迴圈,你可能需要一種方式來中斷它,比如設定一個標誌變數或使用try/except捕獲KeyboardInterrupt異常。
      
    • 獲取時間戳的日期部分

      import time
      from datetime import datetime
      
      timestamp = time.time()
      dt_object = datetime.fromtimestamp(timestamp)
      date_only = dt_object.date()
      print("日期部分:", date_only)
      

五、物件導向

5.1 類和例項

定義類

  • object 父類的名字,預設是object,所有的類都直接或間接的繼承object類

    class ClassName(object):
        .....
    

例項

例項名 = 類名()

class Player(object):
    numbers = 0  # 類屬性 (共用的屬性)

    # 建構函式
    def __init__(self, name, age, addr):
        self.name = name  # 例項屬性
        self.__age = age  # 私有變數
        self._addr = addr  # 受保護的

        # 使用類屬性
        Player.numbers += 1
    '''
        把函式當做變數使用
            @Property
                獲取變數
            @變數名.setter
                設定變數
    '''

    @property  # 獲取變數
    def age(self):
        return self.__age

    @age.setter  # 修改變數
    def set_age(self, age):
        if isinstance(age, int):
            self.__age = age

    def show_info(self):
        print('大家好我叫{},我今年{}歲了'.format(self.name, self.age))

    # 類方法
    @classmethod
    def class_method(cls):
        try:
            print("我是一個類方法" + cls.numbers)
            raise Exception("數值不能和字串拼接")
        except Exception as e:
            print(e)

    @classmethod
    def show_dict(cls):
        dic = {'1': {'name': '張三', 'age': 13}, '2': {'name': '李四', 'age': 18}}
        for k, v in dic.items():
            print(k, v)

    # 靜態方法
    @staticmethod
    def isvalid(age_dict):
        if 'age' in age_dict and age_dict['age'] >= 18:
            return True
        return False


age = {'age': 24}
if Player.isvalid(age):
    mia = Player('mia', 24, '廣東')
    mia.show_info()

    # 獲取物件的所有屬性  不能獲取類屬性
    print(mia.__dict__)
    mia.show_dict()
    print(mia.age)
    mia.age = 30
    print(mia.age)
else:
    print("建立失敗")

魔方函式

  1. __init__() 例項化物件的時候該方法被呼叫
  2. __str__() 定義當使用str列印物件時顯示的內容
  3. __eq__() 判斷兩個物件是否相等

六、多執行緒

python3 執行緒中常用的兩個模組為:

  • _thread
  • threading(推薦使用)

python 中使用執行緒有兩種方式:函式或者用類來包裝執行緒物件

函式式:呼叫_thread模組中的start_new_thread() 函式來產生新執行緒

_thread.start_new_thread ( function, args[, kwargs] )

引數說明:

  • function - 執行緒函式。
  • args - 傳遞給執行緒函式的引數,他必須是個tuple型別。
  • kwargs - 可選引數。
#!/usr/bin/python3

import _thread
import time

# 為執行緒定義一個函式
def print_time( threadName, delay):
   count = 0
   while count < 5:
      time.sleep(delay)
      count += 1
      print ("%s: %s" % ( threadName, time.ctime(time.time()) ))

# 建立兩個執行緒
try:
   _thread.start_new_thread( print_time, ("Thread-1", 2, ) )
   _thread.start_new_thread( print_time, ("Thread-2", 4, ) )
except:
   print ("Error: 無法啟動執行緒")

while 1:
   pass

執行緒模組

Python3 透過兩個標準庫 _thread 和 threading 提供對執行緒的支援。

_thread 提供了低階別的、原始的執行緒以及一個簡單的鎖,它相比於 threading 模組的功能還是比較有限的。

threading 模組除了包含 _thread 模組中的所有方法外,還提供的其他方法:

  • threading.current_thread(): 返回當前的執行緒變數。

  • threading.enumerate(): 返回一個包含正在執行的執行緒的列表。正在執行指執行緒啟動後、結束前,不包括啟動前和終止後的執行緒。

  • threading.active_count(): 返回正在執行的執行緒數量,與 len(threading.enumerate()) 有相同的結果。

  • threading.Thread(target, args=(), kwargs={}, daemon=None)

    • 建立Thread類的例項。
    • target:執行緒將要執行的目標函式。
    • args:目標函式的引數,以元組形式傳遞。
    • kwargs:目標函式的關鍵字引數,以字典形式傳遞。
    • daemon:指定執行緒是否為守護執行緒。

threading.Thread 類提供了以下方法與屬性:

  1. __init__(self, group=None, target=None, name=None, args=(), kwargs={}, \*, daemon=None)
    • 初始化Thread物件。
    • group:執行緒組,暫時未使用,保留為將來的擴充套件。
    • target:執行緒將要執行的目標函式。
    • name:執行緒的名稱。
    • args:目標函式的引數,以元組形式傳遞。
    • kwargs:目標函式的關鍵字引數,以字典形式傳遞。
    • daemon:指定執行緒是否為守護執行緒。
  2. start(self)
    • 啟動執行緒。將呼叫執行緒的run()方法。
  3. run(self)
    • 執行緒在此方法中定義要執行的程式碼。
  4. join(self, timeout=None)
    • 等待執行緒終止。預設情況下,join()會一直阻塞,直到被呼叫執行緒終止。如果指定了timeout引數,則最多等待timeout秒。
  5. is_alive(self)
    • 返回執行緒是否在執行。如果執行緒已經啟動且尚未終止,則返回True,否則返回False
  6. getName(self)
    • 返回執行緒的名稱。
  7. setName(self, name)
    • 設定執行緒的名稱。
  8. ident屬性:
    • 執行緒的唯一識別符號。
  9. daemon屬性:
    • 執行緒的守護標誌,用於指示是否是守護執行緒。
  10. isDaemon()方法:
import threading
import time

def print_numbers():
    for i in range(5):
        time.sleep(1)
        print(i)

# 建立執行緒
thread = threading.Thread(target=print_numbers)

# 啟動執行緒
thread.start()

# 等待執行緒結束
thread.join()

使用threading模型建立執行緒

#!/usr/bin/python3

import threading
import time

exitFlag = 0

class myThread (threading.Thread):
    def __init__(self, threadID, name, delay):
        threading.Thread.__init__(self)
        self.threadID = threadID
        self.name = name
        self.delay = delay
    def run(self):
        print ("開始執行緒:" + self.name)
        print_time(self.name, self.delay, 5)
        print ("退出執行緒:" + self.name)

def print_time(threadName, delay, counter):
    while counter:
        if exitFlag:
            threadName.exit()
        time.sleep(delay)
        print ("%s: %s" % (threadName, time.ctime(time.time())))
        counter -= 1

# 建立新執行緒
thread1 = myThread(1, "Thread-1", 1)
thread2 = myThread(2, "Thread-2", 2)

# 開啟新執行緒
thread1.start()
thread2.start()
thread1.join()
thread2.join()
print ("退出主執行緒")