Python 基礎語法介紹(二)

語言: CN / TW / HK

一、概述

上一篇文章:Python 基礎語法介紹(一),已經介紹了一部分基礎知識了,這裡就繼續介紹python基礎知識。

在這裡插入圖片描述

二、函式

函式是組織好的,可重複使用的,用來實現單一,或相關聯功能的程式碼段,函式能提高應用的模組性,和程式碼的重複利用率。

1)函式定義

定義函式規則如下:

  • 函式程式碼塊以 def 關鍵詞開頭,後接函式識別符號名稱和圓括號 ()。
  • 任何傳入引數和自變數必須放在圓括號中間,圓括號之間可以用於定義引數。
  • 函式的第一行語句可以選擇性地使用文件字串—用於存放函式說明。
  • 函式內容以冒號 : 起始,並且縮排。
  • return [表示式] 結束函式,選擇性地返回一個值給呼叫方,不帶表示式的 return 相當於返回 None。

在這裡插入圖片描述 Python 定義函式使用 def 關鍵字,一般格式如下:

bash def 函式名(引數列表): 函式體 在定義函式名字的時候我們需要注意幾點: - 關鍵字不能作為函式名字。

  • 函式名中不能存在空格。

  • 函式名的首字母必須是大小寫字母或者下劃線。

  • 函式名的其餘字母可以使用字母、數字以及下劃線。

  • 不同函式名大小寫不同的時候為不同函式。

示例如下:

```python

!/usr/bin/python3

定義函式

def get_name(): pass def get_salary(): pass def add_money(): pass ```

2)函式呼叫

當我們建立好函式之後,如果不呼叫的話,函式永遠都不會執行。呼叫函式的時候,直譯器會跳到函式體內,執行函式內的語句,當執行完畢之後回到呼叫的位置繼續執行後續語句。

示例如下: ```bash

!/usr/bin/python3

定義函式

def helloworld(): print('呼叫函式') print('helloworld') print('人生苦短,我用Python')

呼叫函式

helloworld() print('呼叫完畢') ```

3)函式傳參

在呼叫函式的時候,主函式和呼叫函式之間總是離不開資料的傳遞,有了資料的傳遞,也就是引數的傳遞。引數的作用是用來傳遞資料給函式使用。

1、形式引數和實際引數

  • 形式引數為我們定義函式的時候再括號中定義的引數,我們在函式的內部會使用這個引數進行程式碼的編寫;
  • 實際引數函式呼叫的時候傳進來的引數,函式返回的結果是根據這個實際引數來代替形式引數。

2、關鍵字引數

為了提高程式的可讀性,在函式呼叫的時候還可以使用關鍵字引數呼叫

示例如下:

```python

def volume(length,width,height): ... volume = length * width * height ... print('體積為:',volume) ... volume(length=20,width=30,height=3) 體積為: 1800 ```

3、引數預設值

當我們定義一個函式的時候,可以給函式的引數定義一個初始值,這樣在我們呼叫函式的時候如果沒有給出實際引數,那麼函式會使用預設引數

示例如下:

```python

def volume(length=100,width=100,height=10): ... volume = length * width * height ... print(volume) ... volume()#不給出實際引數的時候會使用預設引數100000 volume(10,10,10)#給出實際引數會傳遞實際引數給出輸出結果 1000 ```

4、可變引數

在Python中函式的引數個數是可以變化的,也就是說引數的數量可以是不確定的,這種引數被稱為可變引數。可變引數分為兩種: - 一種是引數前加 *,這種方式的可變引數在傳遞的時候是以元組的形式傳遞。 - 一種是引數前加**,這種方式的可變引數在傳遞的時候以字典的形式傳遞。

元組形式示例如下:

```bash

def add_number(number): ... add_num = 0 ... for i in number: ... add_num += i ... print(add_num) ... add_number(1,2,3,4,5) 15 ``` 字典形式*示例如下:

```bash

def printinfo( arg1, **vardict ): ... "列印任何傳入的引數" ... print ("輸出: ") ... print (arg1) ... print (vardict) ...

printinfo(1, a=2,b=3) 輸出: 1 {'a': 2, 'b': 3}

```

4)函式返回值

在使用函式的過程中通常是呼叫函式,然後被呼叫的函式中的內容會依次被執行,但是我們有的時候需要的不只是執行的步驟,我們還需要獲取到函式中的一些變數,因此我們在使用函式的時候還可以增添一個返回值來獲取函式中的一些資料。

1、語法結構

Python中關於返回值需要使用return語句,它的語法結構為:

python return data 示例如下:

python def get_sum(a,b): sum = a + b return sum get_sum(1,2)

2、多值返回

在返回多個值的時候原理和一個值的時候類似,我們需要注意的一點是當我們返回的是多個值的時候,多個值是被儲存在元組當中的。

示例如下:

```python

def get_data(): ... a = 1 ... b = 2 ... c = 3 ... d = 4 ... return a,b,c,d ... print('返回值的型別:',type(get_data())) 返回值的型別: print('返回值:',get_data()) 返回值: (1, 2, 3, 4)

```

5)變數作用域

變數的作用域指的是一個變數能夠有效的區域,因為我們在使用函式的時候,有的變數是在主程式中定義的,有的是在呼叫的函式中定義的,當我們的主程式使用函式中定義的變數時,就會出現異常。下面來介紹一下區域性變數全域性變數

1、區域性變數

區域性變數,顧名思義,就是作用在區域性區域的變數,如果是在函式中定義的變數,那麼就只在函式中起作用,如果在函式外部使用函式內部的變數,就會出現異常。

示例如下:

```python

def test(): ... data = '區域性變數' ... print('在函式內部輸出data為:',data) ... test() 在函式內部輸出data為: 區域性變數 print('在主程式中輸出data:',data) Traceback (most recent call last): File "", line 1, in NameError: name 'data' is not defined

``` 從上面執行結果可知,由於變數data是在函式內部定義的,我們在主程式中使用變數data則會出現訪問的變數不存在的問題。

【結論】在函式內部定義的變數為區域性變數,未作特別宣告(global)的話是不可以在函式外使用的。

2、全域性變數

全域性變數我們也可以從字面意思中理解到它就是作用在全域性的變數,有的同學可能自然而然的認為那麼全域性變數一定是定義在主程式中的變數了,其實全域性變數也是可以作用在函式中的,在這裡我們來介紹兩種全域性變數的使用方式:

【1】在主程式中定義全域性變數

```python

data = '全域性變數data' def test(): ... print('這是作用在函式中的全域性變數:',data) ... test() 這是作用在函式中的全域性變數: 全域性變數data print('這是作用在函式外的全域性變數:',data) 這是作用在函式外的全域性變數: 全域性變數data

```

【2】 使用global關鍵字在函式中宣告全域性變數

在函式內定義的變數也可以變成全域性變數,這時候我們就要使用到global關鍵字。

首先我們先看一下當全域性變數和區域性變數的名字相同的時候會是一個怎麼樣的情況,看下面的例子: ```python

data = '這裡是全域性變數data' print(data) 這裡是全域性變數data def test(): ... data = '這裡是區域性變數data' ... print(data) ... test() 這裡是區域性變數data print('再檢查一下全域性變數data:',data) 再檢查一下全域性變數data: 這裡是全域性變數data

``` 使用global關鍵字示例如下:

```python

data = '這裡是全域性變數data' print(data) 這裡是全域性變數data def test(): ... global data ... data = '這裡是區域性變數data' ... print(data) ... test() 這裡是區域性變數data print('再檢查一下全域性變數data:',data) 再檢查一下全域性變數data: 這裡是區域性變數data

``` 通過global關鍵字,在區域性中宣告告訴這個函式global 變數是一個全域性變數,那麼修改了之後,全域性中的變數都做了修改,global關鍵字就是可以使一個變數變成全域性變數

6)匿名函式(lambda)

想必大家都知道匿名是什麼含義,匿名就是指沒有名字,我們在寫程式的過程中有時不需要給函式命名,這時候就可以使用匿名函式,我們在Python中使用lambda表示式來使用匿名函式。

1、匿名函式的定義

通過一個例子來介紹一下lambda函式的簡單使用,變數m為我們輸入的值,我們需要採用匿名函式來返回m的平方和,也就是輸入2要返回值為4。

```python

m = int(input('請輸入一個數字:'))#m為輸入的值 請輸入一個數字:6 a = lambda x : x * x #使用變數a來構成一個表示式 print('返回值為:',a(m)) 返回值為: 36

``` 通過下圖再來看一下它的結構: 在這裡插入圖片描述

2、序列呼叫匿名方法

在序列中同樣可以使用匿名函式,使用匿名函式可以幫助我們進行很快的資料篩選,看下面的例子:

```python

my_list = [1,4,6,9,12,23,25,28,36,38,41,56,63,77,88,99] print(list(filter(lambda x : x % 2 == 0,my_list))) [4, 6, 12, 28, 36, 38, 56, 88]

```

7)常用內建函式

Python中常用的內建函式如下: | 函式名 | 說明 | |--|--| | abs() | 返回絕對值 | | bin() | 返回二進位制 | | bool() | 返回布林值 | | chr() | 用一個範圍在256內的整數作引數,返回一個對應的字元 | | cmp(x,y) | 用於比較,前者大於後者返回1,相等返回0,小於後者返回-1 | | dict() | 建立字典 | | eval() | 返回字串表示式的值 | | file() | 建立一個 file 物件 | | filter() | 過濾函式 | | float() | 把整數和字串轉換成浮點數 | | format() | 格式化函式 | | getattr() | 返回一個物件屬性值 | | globals() | 全域性變數 | | hash() | 返回一個物件的雜湊值 | | help() | 檢視函式或者模組的功能 | | hex() | 將10進位制整數轉換成16進位制 | | id() | 返回一個物件在記憶體中的地址 | | input() | 標準輸入 | | isinstance() | 判斷一個物件是否為已知的型別 | | int() | 把字串或數字轉換為整型 | | len() | 返回序列的長度 | | list() | 把其他資料型別轉換為列表 | | map() | 對映函式 | | max() | 返回最大值 | | min() | 返回最小值 | | next() | 返回迭代物件的下一項 | | oct() | 整數轉換八進位制數 | | pow(x,y) | 返回x的y次方 | | print() | 輸出 | | range() | 建立整數序列 | | reduce() | 聚合函式 | | reverse() | 逆序 | | round() | 對浮點數四捨五入 | | set() | 建立集合 | | sorted() | 排序 | | sum() | 求和 |

三、python 模組

Python中有很多功能強大的模組,這些模組有的存在於Python系統庫中有的存在於第三方庫中,這些模組會為我們提供各種各樣的功能。

看下面的示意圖: 在這裡插入圖片描述

1)匯入模組

1、第一種方式:import 模組名

示例如下: python import random#從系統庫中引入這個模組 test = random.randint(1,10)#使用random模組中的randint()方法 print('生成一個隨機數:',test)

2、第二種方式:import 模組名 as 別名

python import math as t test = t.cos(2.5) print(test)

3、第三種方式:from 模組名 import 函式名

python from random import randint test = randint(1,10) print(test)

2)自定義模組和匯入模組

引入的模組通常有三種類型: - 一種是系統庫中存在的模組。 - 一種是第三方模組。 - 最後一種就是我們自己定義來的模組

1、自定義模組

模組名(檔名)為getcolor.py python def get_color(n): if n<13: return '梅花' elif n<26: return '方塊' elif n<39: return '紅桃' else: return '黑桃' 模組名(檔名)為getvalue.py

python def get_value(n): if n==0 or n==13 or n==26 or n==39: return 'A' elif n==12 or n==25 or n==38 or n==51: return 'K' elif n==11 or n==24 or n==37 or n==50: return 'Q' elif n==10 or n==23 or n==36 or n==49: return 'J' else: return n%13

2、呼叫自定義模組

匯入自己定義的模組,關鍵程式碼如下:

bash from getcolor import get_color from getvalue import get_value

四、異常處理和程式除錯

1)異常處理 try...except

一張圖瞭解異常處理機制: 在這裡插入圖片描述 示例如下:

python try: runoob() except AssertionError as error: print(error) else: try: with open('file.log') as file: read_data = file.read() except FileNotFoundError as fnf_error: print(fnf_error) finally: print('這句話,無論異常是否發生都會執行。')

2)手動丟擲異常

Python 使用 raise 語句丟擲一個指定的異常。 raise語法格式如下:

bash raise [Exception [, args [, traceback]]] 在這裡插入圖片描述 示例如下:

```python

x = 10 if x > 5: ... raise Exception('x 不能大於 5。x 的值為: {}'.format(x)) ... Traceback (most recent call last): File "", line 2, in Exception: x 不能大於 5。x 的值為: 10

```

3)使用者自定義異常

```python

class MyError(Exception): ... def init(self, value): ... self.value = value ... def str(self): ... return repr(self.value) ... try: ... raise MyError(2*2) ... except MyError as e: ... print('My exception occurred, value:', e.value) ... My exception occurred, value: 4

```

4)程式除錯

使用assert斷言對Ptyhon程式除錯分析,在表示式條件為 false 的時候觸發異常。。它的語法結構為:

python assert expression[,describe] 在這裡插入圖片描述 示例如下:

```python

assert True # 條件為 true 正常執行 assert False # 條件為 false 觸發異常 Traceback (most recent call last): File "", line 1, in AssertionError assert 1==1 # 條件為 true 正常執行 assert 1==2 # 條件為 false 觸發異常 Traceback (most recent call last): File "", line 1, in AssertionError

assert 1==2 # '1 不等於 2' Traceback (most recent call last): File "", line 1, in AssertionError: 1 不等於 2

import sys assert ('linux' in sys.platform) #"該程式碼只能在 Linux 下執行,在window下執行會報如下錯誤" Traceback (most recent call last): File "", line 1, in AssertionError ```

五、File 檔案操作

在Python中訪問檔案、訪問目錄、讀取檔案和寫入檔案的操作是非常常見的,Python的檔案物件也被稱為類似檔案物件或者流。

1)建立和開啟檔案

建立或者開啟檔案的時候需要使用到open()函式,它的語法結構為:

python open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None) 引數說明:

  • file: 必需,檔案路徑(相對或者絕對路徑)。
  • mode: 可選,檔案開啟模式(常用)
  • buffering: 設定緩衝
  • encoding: 一般使用utf8
  • errors: 報錯級別
  • newline: 區分換行符
  • closefd: 傳入的file引數型別
  • opener: 設定自定義開啟器,開啟器的返回值必須是一個開啟的檔案描述符。

mode 常用引數如下: 在這裡插入圖片描述

2)file物件

  • file.write(str)——將字串寫入檔案,返回的是寫入的字元長度
  • file.read([size])——從檔案讀取指定的位元組數,如果未給定或為負則讀取所有。
  • file.readline([size])——讀取整行,包括 "\n" 字元。
  • file.readlines([sizeint])——讀取所有行並返回列表,若給定sizeint>0,返回總和大約為sizeint位元組的行, 實際讀取值可能比 sizeint 較大, 因為需要填充緩衝區。
  • file.flush()——重新整理檔案內部緩衝,直接把內部緩衝區的資料立刻寫入檔案, 而不是被動的等待輸出緩衝區寫入。
  • file.close()——關閉檔案。關閉後文件不能再進行讀寫操作。
  • file.writelines(sequence)——向檔案寫入一個序列字串列表,如果需要換行則要自己加入每行的換行符。

示例如下:

python file = open('test.txt','w') file.write('第一次寫入。') print(file) file = open('test.txt','a+') file.write('第二次追加寫入。') print(file) 我們可以在寫入之後需要檔案關閉掉,以保證檔案中的內容不被惡意外掛修改,關閉的方式為:

python file.close() 但是使用with可以省略file.close(),因為with會自動關閉檔案。

3)with..open()

每次都寫close()比較繁瑣,Python引入with語句,這樣能夠確保最後檔案一定被關閉,且不用手動再呼叫close方法。

示例如下:

```bash

with open('files.txt','w+') as file: ... file.write('hello world!!!') ... 14 file.readlines() Traceback (most recent call last): File "", line 1, in ValueError: I/O operation on closed file.

```

六、os 模組

我們對檔案的管理是通過檔案物件的方式實現的,而檔案是Python中os模組,我們在管理檔案或目錄的時候,就需要使用Python中的os模組,os模組中有非常多的方法來幫助我們處理檔案及目錄。

1)常用 os 方法

常用的os方法如下表格: 在這裡插入圖片描述 示例如下:

```bash

import os os.name#返回nt為windows,posix為Linux、Unix或mac os。 os.linesep#當前系統的換行符 '\r\n' os.sep#當前系統的分隔符 '\' os.name 'nt' ```

2)常用 os.path 方法

os.path是一個針對路徑的模組,模組內提供對檔案、目錄和路徑管理的函式,常見的方法如下表格: 在這裡插入圖片描述 其中最常用的幾種分別是abspath()exists(path)join(path,name)basename(path)dirname(path)isdir(path),我們來看個例子:

```bash

import os print('當前目錄:',os.getcwd()) 當前目錄: /root print('判斷當前目錄是否存在,存在的話返回True',os.path.exists(os.getcwd())) 判斷當前目錄是否存在,存在的話返回True True

```

七、日期與時間

Python 程式能用很多方式處理日期和時間,轉換日期格式是一個常見的功能。

1)獲取當前時間戳

示例如下: ```python

import time # 引入time模組

獲取當前時間戳

... ticks = time.time() print ("當前時間戳為:", ticks) 當前時間戳為: 1675176378.2444868

```

2)獲取當前時間

從返回浮點數的時間戳方式向時間元組轉換,只要將浮點數傳遞給如localtime之類的函式。

```python

import time

localtime = time.localtime(time.time()) print ("本地時間為 :", localtime) 本地時間為 : time.struct_time(tm_year=2023, tm_mon=1, tm_mday=31, tm_hour=22, tm_min=47, tm_sec=16, tm_wday=1, tm_yday=31, tm_isdst=0)

```

3)格式化時間

```python

import time

localtime = time.asctime( time.localtime(time.time()) ) print ("本地時間為 :", localtime) 本地時間為 : Tue Jan 31 22:48:00 2023 print ("本地時間為 :", time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())) 本地時間為 : 2023-01-31 22:49:12

```

4)時間戳和格式化時間相互轉化

時間戳轉格式化時間 ```bash

import time timestamp = 1675175334 # 時間戳 formattime = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(timestamp)) print(formattime ) 2023-01-31 22:28:54

格式化時間轉時間戳bash import time dt = "2023-01-31 22:28:54" timeArray = time.strptime(dt, "%Y-%m-%d %H:%M:%S") timestamp = time.mktime(timeArray) print(timestamp) 1675175334.0

``` python基礎部分就先到這裡了,非常簡單,網路資料也很多,都差不多,這裡也只是針對常用的知識點整理了一下。講完了基礎部分,接下來就進入高階程式設計了,例如:面向物件、網路程式設計等等,請小夥伴耐心,也可關注我的公眾號【大資料與雲原生技術分享】深入交流~