Python3 第一章 基本語法


1.1 編程語言和python介紹

計算機分為軟件硬件硬件就是我們看得見,摸得着的,比如顯示器,鼠標,鍵盤,CPU,內存,硬盤。

軟件是一段數據,存儲在內存或硬盤,這段數據記錄了一段指令,通過這些指令來操作計算機硬件。

開發軟件就是開發一套機器能識別指令來完成特定的功能,這個的過程被稱為編程,編程所使用的工具是編程語言

 

1.1.1 機器指令與匯編語言

編程語言最初是直接用機器指令,通常是一段二進制數據,如0101..,機器指令很直接,直接就可以操縱硬件

比如讓CPU運行加減,乘除,讓內存存儲數據。

掌握了機器指令,相當於直接和硬件對話,讓硬件做什么就做什么,但是,機器指令是由一個個0101之類的二進制數構成,

掌握機器指令,過於復雜又難以記憶。於是有人就發名了一種助記符,把英語單詞和機器指令對應起來。

如下面的表格

功能 機器指令 助記符
 加  0100  ADD
 減  0101  SUB

 

 

這樣以后再編寫程序就可以不用0100來表示加法了,而是使用助記符ADD來編寫,這樣,可以讓編寫程序的人輕松不少,最后再統一替換成對應的二進制指令。

這種用助記符編程的工具就是匯編語言。

 

1.1.2 低級語言和高級語言

后來又有人覺得匯編語言麻煩,因為匯編語言實際上就是對機器指令的一對一替換,雖然記憶指令方便了,但是在控制計算機硬件的時候還要事無具細的控制。

比如實現一個小小的功能,在顯示器上顯示文本,可能都需要數十行的代碼來編寫。

於是有人研究出了更高級的編程語言,如C語言,這種較高級的語言,把一些控制硬件瑣碎的操作進行的封裝,直接用很少的代碼就可以代替匯編或機器指令一段常用的代碼。

這樣用C語言編寫代碼更有易於從邏輯上去思考,而不是把精力浪費在對機器硬件繁鎖的操作上。

實際上最終想要在硬件上運行,還是要把C語言編寫的代碼替換成對應的機器指令來執行,不過這事就由編譯程序來做就可以了,程序員只負責寫C語言代碼即可。

 

C語言雖然是一大進步,告別了繁瑣的硬件操控,但是仍然包含了很多關於內存的操控,比如創建數據時,要申請內存空間,當不想使用數據時,要手動釋放內存空間。

當我們編寫程序的時候還要考慮內存的申請和釋放,這可能會影響我們編寫的思路。

所以在C語言的基礎上,出現一些更高級的編程語言,大部分是針對C語言進行的再封裝,把C語言中常用的功能代碼段,操作指令,還有C語言編程過程中需要考慮的一些細節封裝。

讓編寫程序的人只考慮程序的組織邏輯,盡量的少去思考硬件的相關的東西,這種語言就是高級語言。

常見的高級語言有C++,JAVA,PYTHON, GO...

python 就是一門高級語言,我們稱C語言為低級語言。

高級語言因為封裝了更多的東西,所以編寫程序的速度會很快,比如實現一個功能,用C語言需要用幾百行代碼來實現,用python可能只需要寫幾行代碼來實現。

但是最終想在計算機中運行,還是要翻譯成機器指令來執行。高級語言在翻譯的過程中,會產生更多的無用操作,沒有低級語言直接。所以高級語言的執行速度不如低級語言。

種類  代表語言 執行效率 開發效率
低級語言 C
高級語言 Python 

 

那么到底是執行效率重要還是開發效率重要呢?不同的應用場景下,選擇也不一樣。

比如操作系統,位於底層,一切軟件運行在操作系統之上,如果操作系統都不快,那運行在操作系統上的軟件也快不了,

另外操作系統本身的功能也是需要經常和硬件來打交道。所以開發操作系統,肯定首選C這種低級語言。

 

軟件公司,可能為了搶占市場,一個領域的商機發現之后,當然希望快速的開發出來,盡早面市,這種情況會選擇高級語言,因為相比於那一點點效率,產品的研發速度更重要。

實際上高級語言雖然慢,但是通常情況下大家是可以接受的,比如C語言運算一個功能需要0.001秒,python需要0.1秒,雖然速度差了一百倍,但是我們大部分情況下是感知不出來的。

 

1.1.3 Pyhon語言介紹

首先python 是一門高級語言。

python 還是是解釋型語言。

高級語言想要在計算機上運行,必須翻譯成機器能識別的指令,即機器碼來運行。

如何翻譯成機器指令,分為兩種

  • 編譯型語言,直接把高級語言的代碼翻譯成機器可識別的指令然后保存下來,接下來每次運行,都直接運行翻譯后的機器代碼就可以了。
  • 解釋型語言,需要有一個解釋器,運行時由解釋器一行一行的翻譯成機器代碼並運行。

python還是一門可移植的語言

可移植的語言可以理解為一套代碼可以在不同的平台,操作系統上運行。常的操作系統如windows, linux, mac osx, unix..

由於是解釋型語言,所以Python運行的環境只要有python解釋器就可以,不存在平台的限制。

 

python是一門面向對象的語言

面向對象是一種當下最流行的軟件開發方法和開發思想,把現實事物模擬成計算機代碼中的對象處理,現實事物可以有數據和行為,

就可以對應面象對象語言中的類的屬性和方法。面向對象的核心,封裝,繼承,多態,在python中都有非常好的支持。

 

python的解釋器根據開發的言不同,分為以下幾類

  • CPython   使用C語言開發的解釋器,目前最流行,使用最廣的解釋器
  • Jython   使用java語言開發的解釋器,可以很好的和java語言交互,可以把python直接編譯成對應的Java代碼
  • Ironpython  使用C#開發的解釋器,可以很好的和微軟的.Net平台交互。
  • Pypy   使用python語言子集開發的解釋器,采用JIT技術,做了大量的優化,解析速度是所有解釋器里最快的,比Cpython還要快很多倍

python語言本身是有版本的,因為Python本身也需要不斷的完善

一般情況下,小版本的變更沒有太大的影響。

不過Python有兩個大版本,即Python2和Python3

這是兩個不兼容的版本,因為python語言為了使自己變得更完善,內部做了大量的優化,導致Python3和Python2的一些內容不一樣,

最明顯的就是同樣的代碼在python3上可以運行,在python2上不能運行。

目前官方已經不再維護Python2的版本,這是一個已經被時代廢棄的版本。

目前所有的項目都在從Python2轉到python3,學python2已經沒有多少意義了。

不過Python2和python3對於編寫程序的人來說,影響並不是特別大,個別的一些用法不同,只需要稍微調整一下就可以了。

 1.2 Python安裝及執行

1.2.1 安裝解釋器

想要編寫並運行Python代碼,第一步,就是安裝一個Python的解釋器。

我們可以去Python官網下載一個python3的解釋器

https://www.python.org/downloads/

挑選一個適合自己操作系統的解釋器安裝即可。

1.2.2 運行Python代碼

運行python代碼有兩種方法

第一種是把代碼寫到文件當中保存,調用解釋器解釋文件。

比如我們新建一個記事本,在其中寫上以下代碼

含義是在屏幕上顯示 “hello, python”

print("hello, python")

然后保存為 helllo.py文件

想讓解釋器解釋我們的代碼文件,就直接把文件的路徑告訴解釋器就可以了。

打開命令行,輸入python解釋器的路徑 + 源文件的路徑

 

  

第二種是直接打開解釋器,在解釋器中輸入一行代碼,解釋器就立即解釋執一行代碼

這種被稱為交互模式,主要是用來調試的, 在命令行中直接輸入python解釋器的路徑,就可以直接運行

 

 其中,>>> 后面就可以輸入我們想要讓解釋器解釋的代碼

1.2.3 源文件的編碼

只要涉及到文本,就涉及到編碼

我們的python代碼文件也是由文字組成的,所以python代碼文件也隱含了一個編碼問題

在python3 當中,解釋器會默認認為我們的python文件是UTF-8格式的編碼

UTF8是通用的編碼格式,也是現在的主流。

但是如果我們不想讓解釋器以UTF8格式編碼解析,我們就可以在代碼文件第一行,加上下面的

這樣解釋器就會以gbk編碼來解析我們的代碼文件 

# -*- coding: gbk -*-

 

如果在linux上,可能會加上一行解釋器的路徑 ,這時就需要把coding放在第二行

#!/usr/bin/env python3
# -*- coding: gbk -*-

1.2.4 環境變量

如果每次都在命令行里輸入這么長的python解釋器路徑,覺得很麻煩,那有一個方法,就是我們把Python解釋器的路徑告訴操作系統

之后我們運行解釋器就不用把完整的路徑也輸入出來了。

如何告訴操作系統呢,操作系統有一個環境變量叫path,我們把python的路徑加進去就可以了。

win10環境變量打開方式 

這里給出win10環境變量的配置方法

https://jingyan.baidu.com/article/c33e3f483ab7d4ea14cbb548.html 

把Python的安裝路徑配置進去之后,在命令行里直接輸入python,就代表運行python解釋器了。

1.2.5 PyCharm-最好的IDE

IDE就是集成開發環境,(Integrated Development Environment)就是一個我們用來幫助開發Python代碼的軟件

如果我們不用IDE,寫一個python代碼文件,要用記事本編寫,再保存,再用python解釋器去執行,有點麻煩,

使用了IDE后,可以快速的新建文件,編寫代碼,而且代碼出錯會有提示,

執行代碼,只需要鼠標點一下,或者快捷鍵按一下,就可以讓代碼運行起來,

其實用性還遠不止如此,總之一句話,IDE就是讓你舒服,一些麻煩事他來幫你做,你只需要關注寫代碼就行了。

 

目前開發python代碼最好的工具就是PyCharm。

PyCharm分為兩種版本

  • 社區版:提供python開發的基礎功能,重要的是,免費
  • 專業版:不但有基礎功能,還額外提供了WEB開發的功能,比如CSS,JS,HTML,SQL等,但是專業版收費

用哪個版本,這個看自己的實際需要,建議可以先用社區版學習Python,如果有需要,再考慮用各種方式獲得專業版軟件。

當然如果有條件,就直接安裝使用專業版。我只知道專業版是要收錢的,不花錢能不能用,我就不知道了。。。

pycharm 官網下載地址

https://www.jetbrains.com/pycharm/download/

   

 

 Community就是社區版, Professional就是專業版

 

1.2.6 jupyter

python內置有很多別人實現好的功能,都放在倉庫里了,有的東西是在python語言里面的,

由python官方提供的,叫做標准庫可以直接拿來用,有些東西是一些技術特別厲害的人或組織提供的,叫做第三方庫

想用第三方庫,需要去網上下載,python所有的第三方庫會放在一些固定的網絡上,這些網絡叫源,

獲取第三方庫很簡單,只需要簡單使用pip命令就可以了,

比如我們這里想安裝一個jupyter

pip install jupyter

 

默認pip 去獲取的第三方庫的源是國外的網站,我們訪問起來速度不行

那我們可以通過配置,改變這個獲取第三方庫的源,

需要通過一些配置,來改變源

比較常用的國內源有:

(1)阿里雲 http://mirrors.aliyun.com/pypi/simple/2)豆瓣http://pypi.douban.com/simple/3)清華大學 https://pypi.tuna.tsinghua.edu.cn/simple/4)中國科學技術大學 http://pypi.mirrors.ustc.edu.cn/simple/5)華中科技大學http://pypi.hustunique.com/

如果只是想臨時修改
在使用pip的時候,加上參數-i和源地址

pip install -i http://mirrors.aliyun.com/pypi/simple/ jupyter

如果想每次使用pip源都使用修改后的,不用加-i參數

那就使用永久方法,把源地址配置一下

liux上修改源

創建或修改 ~/.pip/pip.conf 

windows上修改源

創建或修改 c:\Users\用戶名\pip\pip.ini

[global]
index-url = http://mirrors.aliyun.com/pypi/simple/
[install]
trusted-host = http://mirrors.aliyun.com

 

 

安裝 jupyter后,在命令行里輸入命令運行

jupyter-notebook

 

1.3 變量及命名規則

1.3.1 什么是變量

變量是用來存儲可變數據的,我們在編寫程序的時候,想要記錄一些狀態,比如一個人的身高,體重,名字,性別,

這些數據在程序運行時需要存儲在內存中,記錄下來,當有變化時,又可以去修改他們的值。

我們把內存可以理解為一個一個的小房間,變量理解為房間的門牌號。

房間里存放的是各種數據,數據可以隨時變化,修改。

如 下面的代碼 

name = "張三"
age = 18 

name和age是變量,他們可以自已定義用什么符號(門牌號),

"張三"和 18是數據,用來記錄張三的姓名和年齡狀態

這些數據是保存在內存當中的,計算機的內存中有兩個小房間中就存儲着張三和18這兩個值

 

 

 

1.3.2 變量命名規則

變量名(門牌號)可以自己起,但必須符合以下規則 

必須以由字母或下划線(_)開頭,並由數字,字母,下划線組成

比如合法的變量名

name123
_age_2
A_B_C_3_4

不合法的變量名

9abcd
ag(^ $t5

另外,變量名不能和python的關鍵字一樣,否則會引起沖突

怎么知道python有哪些關鍵字呢?

在python解釋器里輸入下面兩行代碼

import keyword
print(keyword.kwlist)

 

變量名是區分大小寫的

比如 name 和Name就是兩個不同的變量名

DEL就不會和關鍵字del產生沖突

1.4 基本數據類型和運算符

數據存儲在內存當中,是有類型的

這里先介紹三種最基本的類型

1.4.1 數字

數字分為兩種,整數和浮點數

整數就數字,如,1314,8848,1234567890987654321

浮點數就是小數, 3.1415926, 0.001

1.4.2 字符串

字符串就是一段用引號包起來的字符,可以是單引號,雙引號,三個單引號,三個雙引號包起來

注意引號必須是英文中的引號,輸入法要切換到英文狀態下再輸入

如 '你好', "孔雀東南飛", """夜落烏啼霜滿天""", '''君不見黃河之水天上來''','Good Morning'

1.4.3 布爾

布爾只有兩個值 True和False,對應真和假

當某件事,某個判斷成立,就是True, 就是真的意思

反之就是False,是假的意思

1.4.4 運算符

運算符是用來運算數據的

先介紹兩類運算符

1.4.4.1 算術運算符

運算符 功能 例子
+ 加法運算

>>>100 +200

300

- 減法運算

>>>300 - 100

200

* 乘法運算

>>>2 * 5

10

/ 除法運算

>>> 3/2

1.5

% 取余運算

>>>10 % 6

4

** 乘方運算

>>>2 ** 10

1024

// 整除運算

>>> 3//2

1

算術運算符主要是用於對數字類型做運算,與數學上的運算概念是一致的。

所以運算的數據類型必須都是數字類型,如果我們用兩個字符串做 除法,解釋器就會給我們報錯,

同樣給出了提示,不支持字符串和字符串之間做除法運算

>>> '姑蘇城外寒山寺' / '夜半鍾聲到客船'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module> TypeError: unsupported operand type(s) for /: 'str' and 'str'

但是字符串和字符串之間是可以做加法運算的,其功能是,把兩個字符串拼成一個字符串

>>> '姑蘇城外寒山寺,' + '夜半鍾聲到客船'
'姑蘇城外寒山寺,夜半鍾聲到客船'

另外,一個字符串可以用來乘以一個整數,其功能是,把字符串重復多少次

>>> '鵝,' * 3 
'鵝,鵝,鵝,'

1.4.4.2 關系運算符

關系運算符是用來運算兩種數據類型的關系的,運算數據可能是多種類型,運算結果是布爾值

 

運算符 功能 例子
== 相等判斷

>>>1 == 2

False

!= 不等判斷

>>>'你好' != "你好"

False

> 大於判斷

>>>100 > 99

True

>= 大於等於

>>>  100 >=100

True

< 小於判斷

>>> 0.5 < 0.5

False

<= 小於等於

>>>  1<= 2

True

 

關系運算符還支持三種 連接運算, 中文含義叫與,或,非

and 並且(與運算), 兩個同時為真才為真  

or   或運算,兩個有一個是真的,結果就為真

not , 把對應布爾值取反

比如

1 == 1 and 1 == 2 # False
1 != 1 and 1 != 2 # False
1 == 1 and 2 == 2 # True

1 == 1 or 1 == 2 # True
1 != 1 or 1 != 2 # True
1 != 1 or 2 != 2 # False


not 1 == 1 # False
not  1 != 1 # True

 

 

其它的運算結果為布爾值的還有 in, not in 

is, is not

 

 

1.4.4.3 賦值運算符

賦值操作,是把數據和變量綁定起來,數據是存儲在內存中的,所以每一個數據在內存中會有一個地址,類似於門牌號

賦值操作,直接上是讓變量這種符號和數據內存中的地址(門牌號)建立起關系,以后訪問內存中的這塊數據,只需要使用變量名就要以拿到內存中的這塊數據 

最常用的賦值就是用一個等號

num = 123
name = '道可道,非常道'

也可以這樣賦值,這種也叫序列賦值

x, y, z = 1, 2, 3
x, y  = y, x

也可以鏈式賦值

x = y = z = 1

也可以增量賦值

x += 1   #等價於x = x + 1  下面的也都類似
y *= 2
x -= 1
y /= 2
x **= 2
y //= 2
x %= 2

 

1.5 程序設計

程序運行,分為三種基本的結構

  • 順序結構,正常情況下,解釋器會自上而下一行一行的執行代碼
  • 選擇結構,程序中出現分支,有選擇的執行代碼
  • 循環結構,程序中重復執行一段代碼

實際上任何一段程序都是由這三種最基本的結構來組成的,他們之間可以互相混合使用

比如選擇結構中可以包括循環結構,循環結構中重復執行的內容可以是順序結構,也可以帶選擇結構,也可以再包括一個循環結構...

1.5.1 輸入和輸出

為了寫一些簡單的程序,我們先介紹兩個基本的函數, print 和 input

print函數是用來顯示數據,把數據在命令行上顯示 ,print函數可以顯示任何數據,顯示多個數據,用逗號隔開

>>> print('明月幾時有')
明月幾時有
>>> print(3) 3 >>> print(3+2) 5 >>> print(True, False, 1, '君問歸期未有期') True False 1 君問歸期未有期

 

input是用來輸入數據,讓我們可以在命令行上輸入數據,收集到輸入的數據后,傳遞給程序中的變量

input輸入的數據統一都是字符串的格式, input后面的括號里還可以加入輸入提示信息,用字符串來表示

1 >>> name = input("你好,請問你叫啥名?")
2 你好,請問你叫啥名? 3 帥比 4 >>> print(name) 5 帥比

第3行的名字是我們自己輸入的,輸入之后,把內容賦值給了變量name,第4行再打印出來

1.5.2 順序結構

順序結構就是自上而下的逐行執行,實際上學了以上的內容,我們就可以編寫順序結構的程序了

 

 

下面我們可以做兩個練習感受一下。

練習一, 表示溫度有兩種單位,華氏度和攝氏度, 我們常用的是攝氏度,攝氏度轉換成華氏度的公式, 華氏度=1.8 * 攝氏度 + 32

設計一個程序,用戶輸入攝氏度,輸出對應的華氏度,

View Code

注意

  • 代碼中#號后面的內容 是注釋,解釋器會直接跳過這一行,解釋下一行的代碼 
  • input輸入的是字符串,不能參與數算術運算,需要用float把字符串轉換成小數,如果想轉換成整數用int

練習二,用戶輸入數字,判斷用戶輸入的是否是奇數,如果是奇數,顯示True, 不是,顯示False

View Code

 

1.5.3 選擇結構

選擇結構,是指程序有選擇的執行,靠什么來選擇呢,就是我們前面學到的布爾類型,True 和False

選擇結構的一般句式是

if exp:
    do something
elif exp: do something else: do something

解釋器讀到if 開始進行判斷

exp是一個表達式,什么是表達式呢,表達式就是一段運算,包括數據類型和運算符,也可以是一個函數,只要運算之后會生成一個值。

什么是值呢,值就是可以被賦值給變量的數據。

exp的值換算成布爾值,如果是真,就執行在if exp下面的一段縮進的代碼段

exp的值換算成布爾值,如果是假,就跳到elif exp 繼續判斷。elif 可以有多個,也可以一個也沒有

.

.

.

如果所有的elif 后面的exp換算成布爾值都是假,就執行else下面縮進的代碼段

其中只有if 語句是必須的,其它elif和else語句都是可選的,就是說可以不使用。

每一個分支下面的代碼段,可以是任意的python語句,當然也包括if語句,所以if語句是可以嵌套的

 

選擇語句程序基本執行流程

 

 

 

 

 

 

 

理解條件語句,我們可以做幾個練習

練習一 輸入成績,如果60分以下,輸出不合格,60~85分輸出良好,85~100分輸出優秀

score = input("請輸入成績:")
score = float(score)
if score < 60:
    print("不合格!")
elif score < 85:
    print("良好!")
elif score <= 100:
    print("優秀!")
else:
    print("成績異常!")

練習二 輸入用戶名和密碼,如果用戶名為 zhangsan, 密碼為 123456, 輸出登陸成功,否則輸出 登陸失敗

 

username = input("請輸入用戶名:")
password = input("請輸入密碼:")
if username == 'zhangsan':
    if password == '123456':
        print('登陸成功')
    else:
        print('登陸失敗')
else:
    print('登陸失敗')
View Code

上面這段代碼不是最優解,只是為了演示選擇語句的用法 

 

1.5.4 循環結構

循環結構是用來重復執行一段代碼的,如何判斷是否重復和結束重復呢,還是用一個結果為布爾值的表達式來判斷

循環結構的基本句式是

while exp:
    do something
else:
    do something

先判斷exp表達式的結果是否為真,如果為真,執行一次下面縮進的代碼塊,

然后再回到exp表達式進行計算,如果結果為真,就再執行一次下面縮進的代碼塊,

直到某一次exp表達式計算結果不為真,如果有else分支,就先執行else分支下面的語句,再執行while語句后面的代碼 

如果沒有else分支,就直接 while語句后面的代碼 

循環中的else語句同樣是可有可無的

 

 

 

 

 

 

 

另外,循環語句的縮進代碼塊中,可以使用break語句,直接跳出循環,甚至不進行判斷,不執行else分支,直接執行while語句后面的代碼

while True:
    print("執行break語句")
    break
else:
    print("break 后不會執行這里")

print("break后會直接跳到這里來執行")

循環語句的縮進代碼塊中,可也以使用continue語句,直接跳過continue后面的語句,進行exp表達式的判斷

num = 1
while num < 100:
    num = num + 1
    # 判斷是否能被2整除,如果是偶數,就直接跳下一次循環
    if num % 2 == 0:
        continue
    print("如果", num, "是偶數", "就不會執行到這里")

 

做幾個練習加深一下理解

練習一 輸出1~100以內所有整數的和

sum = 0
i = 1
while  i <= 100:
    sum = sum + i
    i = i + 1
print(sum)

 

練習二 輸出1~100之間的奇數

i = 1
while i<=100:
    if  i % 2 != 0 :
        print(i)
    i = i + 1

 

練習三 輸出1~100 之間所有偶數的和

sum = 0
i = 1
while i <=100:
    if i%2== 0:
        sum += i  # sum = sum + i
    i += 1
print(sum)

 

練習四 輸出1-2+3-4+5.. 100的和

i = 1
sum = 0
while i <= 100:
    if i % 2 == 1:
        sum = sum + i
    else:
        sum = sum - i
    i += 1
print(sum)
View Code

 

練習五 輸入用戶名密碼,假設用戶名為zhangsan 密碼為123456,如果用戶名密碼匹配,輸出成功,

如果密碼輸入錯了,提示重新輸入,連續輸錯三次用戶名和密碼就退出登陸,提示登陸失敗

count = 1
while True:
    username = input("請輸入用戶名:")
    passowrd = input("請輸入密碼:")
    if username == 'zhangsan' and passowrd == '123456':
        print("登陸成功!")
        break
    elif count == 3:
        print("登陸失敗!")
        break
    else:
        print("用戶名或密碼錯誤,請重新輸入")
        count = count + 1
View Code

 

練習六 求斐波那契數列中小於1000的數, 斐波那契數列定義, 第一個數是0,第二個數是1,從第三位開始,每一個數字是前兩個數字的和

如0,1,1,2,3,5,8 ...

a, b = 0, 1
while a < 1000:
    print(a, end=',')
    a, b = b, a+b
View Code

 

 

1.5.5 空語句 

當我們想在一個代碼塊中什么都不執行時,可以用pass來代替,pass表示一個空語句 ,什么都不執行

if score == 60:
    pass
else:
    print("不及格")

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM