# :-: 語言特性和基礎概念
[TOC]
## 一、語言特性
### 1.程序自上而下運行
示例:
```
import time
print(5)
time.sleep(1)
print(4)
time.sleep(1)
print(3)
time.sleep(1)
print(2)
time.sleep(1)
print(1)
```
以上程序將逐行運行,每隔一秒打印一個數字,輸出結果如下:
~~~
5
4
3
2
1
~~~
### 2.區分大小寫
`a = 10`與 `A = 10`,生成了兩個不同的變量。
### 3.全部為英文狀態下的標點符號
編號語法中包括以下幾種標點符號必須使用英文符號,否則會報錯
- 逗號 `,`
- 括號 `( ) [ ] { }`
- 冒號 `:`
- 空格 ` `
- 分號 `;`
- *字符串里的內容不受限*
## 二、函數
函數可以簡單理解為完成特定功能的一段代碼,它分為兩部分:
1. 調用(使用別人寫好的函數的功能)
2. 定義(自己造輪子,完成特定功能,提供給自己和他人使用)
>我們初期都是在學習如何調用函數,等掌握了基礎才開始嘗試定義自己的函數。
這里介紹兩個最常用的函數:
### 1.print()
`print('hello world')`
這句話將 `hello world` 打印了出來。
還可以同時打印多個內容,并指定分隔符和結束符號:
`print(1, 2, 3, sep='啦啦', end='#######')`
打印的內容是`1啦啦2啦啦3#######1`
### 2.input()
`input("請輸入一個數字:")`
這句話將提示 `請輸入一個數字:` ,并等待用戶輸入,輸入完成后返回用戶輸入的內容。
- 返回的類型是字符串,后面會詳細介紹。
- **用戶輸入的值不可控**(你可能期待用戶輸入一個整數,但用戶可能輸入的是一串文字)
- input() 由于需要等待用戶輸入后才繼續運行,所以可以作為程序暫停的一種方式。
## 三、變量
### 1.變量的概念
> 人類語言里面,當我們提到一個人或物體, 是怎么說的?
>
> 比如說 聊天的時候,提到你的一個同學, 提到一支球隊
>
> 對了,用他們的**名字**。
>
> 比如: 王曉剛同學, 湖人隊等等。
>
> 如果不允許使用 事物的名字, 我們的話就沒法說了。
**變量可以理解為一種容器,里面可以存放任何東西**。如果放進一個蘋果,那容器里面就是蘋果,如果放一只鉛筆,那容器里面就是鉛筆。
計算機語言中,如果產生了數據對象,卻沒有用容量把它們存放起來,就像這樣
~~~python
16
'我愛你中國'
~~~
我們后面的代碼,怎么去使用這個數字`16`和 字符串`'我愛你中國'`呢?很顯然是沒辦法使用了。
編程語言為了方便操作數據對象,就需要使用容器存放數據對象,并給容器起一個名字。
我們把Python語言中容器的名字, 稱之為**變量名**, 有時也簡稱**變量**。
所以Python中的變量,就是容量的名字,存放著各種數據對象。
例:
```
A = 5
A = '中國'
```
這里面 `A` 就是一個容器的名字,我們先把數字5放到`A`容器里,那`A`就代表數字5,我們再把`中國`放進`A`容器里,那`A`就代表`中國`。
### 2.變量命名
>變量用的好或不好,和代碼質量有著非常重要的聯系,合理的使用變量,可以讓你的代碼可讀性更高并且更加簡潔。
#### 2.1.變量命名
**1)命名的規范性**
- 變量名可以包括字母、數字、下劃線,但是數字不能做為開頭。
- 系統關鍵字不能做變量名使用,如print, input等
- 除了下劃線之外,其它符號不能做為變量名使用 !
- Python的變量名是區分大小寫的
**2)編程語言常用駝峰命名法**
- 大駝峰:每一個單詞的首字母都大寫 FirstName LastName
- 小駝峰:第一個單詞以小寫字母開始,后續單詞的首字母大寫 firstName lastName
但是在python中一般使用小駝峰加下劃線的方式
```
has_error
is_person
```
#### 2.2.變量命名的描述性
在接受范圍內,變量名所描述的內容越精準越好。
- BAD: day, host, cards, temp
- GOOD: day_of_week, hosts_to_reboot, expired_cards
變量名能讓人猜出類型。
例如: Bool 類型
- is_user : 是否是用戶
例如: int/float 類型
- port:端口號
- age:年齡
這些很直觀的能讓人猜出類型。
>注意: 不要使用復數來表示一個 int 類型變量,比如 apples,最好用 number_of_apples來替代。
#### 2.3.變量名盡量短,但是不要太短
- 一個好的變量名,長度應該控制在兩到三個單詞左右
例如,`person_index`
- 同一段代碼內不要使用過于相似的變量名,比如同時出現 `users`、`users1`、 `user3`。
- 不要使用帶否定含義的變量名,用 `is_special `代替 `is_not_normal`。
#### 2.4.合理使用變量
同一個變量名指代的變量類型,也需要保持一致性。
在一個函數中,一個變量名叫做 `photo`, 那么在其他地方就不要改成`image`。
#### 2.5. 變量定義盡量靠近使用
剛開始學習編程時,我們習慣把定義的變量放在開頭,或一些函數最前面。如下
```
def get_name():
students = []
teachers = []
```
>***~~第3至第6小點是變量使用技巧,可以以后再回來看~~***
### 3.合理使用namedtuple/dict
Python中的函數可以返回多個值,如果某一天我們想讓函數再多返回一個值怎么辦呢?
```
#之前
def get_name():
return student, teacher
#現在
def get_name():
return student, teacher, parent
```
namedtuple/dict 此時可以派上用場
```
#1. 使用dict
def get_name():
return {
'student': student,
'teacher':teacher,
'parent' :parent
}
names_dict = get_name()
# 2. 使用 namedtuple
from collections import namedtuple
Names = namedtuple("Names", ['student', 'teacher', 'parent'])
def get_name():
return Names(
student = student,
teacher = teacher,
parent = parent
)
names = get_name()
```
**但是這樣不能像之前一樣,每一次解包多變量接受函數返回值。**
### 4. 控制單個函數內的變量數量
當某一函數過長時,或者包含太多變量時,請及時把它拆分成多個小函數。
### 5. 刪除掉沒用的變量
在一個函數中,如果某一個定義的變量沒有被用到,請及時刪除它。
### 6. 定義臨時變量提高可讀性
```
if student.is_active and (student.sex == 'female'):
student.add_tolist()
return
#把上面的例子變成如下
student_is_eligible = student.is_active and (student.sex == 'female')
if student_is_eligible:
student.add_tolist()
return
```
需要合理運用臨時定義對象,把不必要的東西賦值成臨時變量反而會讓代碼顯得啰嗦!
## 四、代碼注釋
我們寫的代碼 為了 別人容易看懂, 甚至自己 以后能看懂, 就需要加入一些我們熟悉的**人話**,也就是人類語言,輔助理解。
這些輔助理解的人話,就是注釋。
這些人話可以是任何一種語言,只要方便你看懂代碼就行,中文、英文、法文都可以。
Python的注釋以`#`開頭,后面的內容都是注釋
```
# info 變量 記錄 作者的信息,包括 名字,身高,體重
info = {'name' :'不知百度知', 'height':'180cm'}
# 改變 作者的身高記錄
info['height'] = '175cm'
print(info) # 打印身高到屏幕上
```
怎么樣,有了上面的注釋,這些代碼是不是更容易讀懂了?
> 我們要注意的是,通常注釋是不會對代碼的執行有影響的(除了一些非常特殊的注釋,比如代碼開頭的文件編碼注釋,以后會講)
基本用法:
```
# 單行注釋
# 我又注釋一行
# 我再注釋一行
a = 10 # 行尾注釋
# 下面是多行注釋,適合大段文字
'''
床前明月光,
疑是地上霜。
舉頭望明月,
低頭思故鄉。
'''
```
## 附:The Zen of Python (Python之禪)
最后分享一下 Zen of Python 準則。
> 在交互式解釋器中輸入 import this 就會顯示 Tim Peters 的 The Zen of Python
| The Zen of Python, by Tim Peters | Python之禪 by Tim Peters |
| ------------------------------------------------------------ | ------------------------------------------------------------ |
| Beautiful is better than ugly. | 優美勝于丑陋(Python 以編寫優美的代碼為目標) |
| Explicit is better than implicit. | 明了勝于晦澀(優美的代碼應當是明了的,命名規范,風格相似) |
| Simple is better than complex. | 簡潔勝于復雜(優美的代碼應當是簡潔的,不要有復雜的內部實現) |
| Complex is better than complicated. | 復雜勝于凌亂(如果復雜不可避免,那代碼間也不能有難懂的關系,要保持接口簡潔) |
| Flat is better than nested. | 扁平勝于嵌套(優美的代碼應當是扁平的,不能有太多的嵌套) |
| Sparse is better than dense. | 間隔勝于緊湊(優美的代碼有適當的間隔,不要奢望一行代碼解決問題) |
| Readability counts. | 可讀性很重要(優美的代碼是可讀的) |
| Special cases aren't special enough to break the rules.Although practicality beats purity. | 即便假借特例的實用性之名,也不可違背這些規則(這些規則至高無上) |
| Errors should never pass silently.Unless explicitly silenced. | 不要包容所有錯誤,除非你確定需要這樣做(精準地捕獲異常,不寫 except:pass 風格的代碼) |
| In the face of ambiguity, refuse the temptation to guess. | 當存在多種可能,不要嘗試去猜測 |
| There should be one-- and preferably only one --obvious way to do it. | 而是盡量找一種,最好是唯一一種明顯的解決方案(如果不確定,就用窮舉法) |
| Although that way may not be obvious at first unless you're Dutch. | 雖然這并不容易,因為你不是 Python 之父(這里的 Dutch 是指 Guido ) |
| Now is better than never.Although never is often better than *right* now. | 做也許好過不做,但不假思索就動手還不如不做(動手之前要細思量) |
| If the implementation is hard to explain, it's a bad idea.If the implementation is easy to explain, it may be a good idea. | 如果你無法向人描述你的方案,那肯定不是一個好方案;反之亦然(方案測評標準) |
| Namespaces are one honking great idea -- let's do more of those! | 命名空間是一種絕妙的理念,我們應當多加利用(倡導與號召) |
- 一、Python基礎
- 1. 序言
- 1.1 Python簡介
- 1.2 安裝和使用IDE
- 1.3 語言特性和基礎概念
- 2. 基本數據類型
- 2.2 字符串型
- 2.2.2 ASCII簡介
- 2.2.4 字符串常用函數
- 3. 條件分支
- 3.3 閑聊條件判斷和運算符優先級
- 10.正則表達式
- 【降龍十八章】Python小技巧
- 18.1 學習網址
- 18.2 PIP切換源
- 18.3 使用whl來安裝
- 【工具優化】IDE優化技巧
- Anaconda
- Jupyter Notebook 的 Markdown 添加大綱
- Jupyter Notebook中圖片縮放和居左
- Anaconda設置環境變量
- Pycharm
- PyCharm新建文檔配置
- 設置字體和字號
- 設置主題和字體配色
- 保存和導入配置
- 設置對選擇內容自動添加引號
- 推薦安裝的插件
- Markdown
- 表格格式
- 二、Python進階
- copy和deepcopy
- 《零基礎入門學習 Python 》【小甲魚版】
- 001.和Python的第一次接觸+習題復習
- 002.用Python設計的第一個游戲 +習題復習
- Pygame詳解
- Pygame詳解:前言
- Pygame詳解(一):Color類
- Pygame詳解(二):display 模塊
- Pygame詳解(三):draw 模塊
- Pygame詳解(四):event 模塊
- Pygame詳解(五):font 模塊
- Pygame詳解(六):image 模塊
- Pygame詳解(七):key 模塊
- Pygame詳解(八):locals 模塊
- Pygame詳解(九):mixer 模塊
- Pygame詳解(十):mouse 模塊
- Pygame詳解(十一):Rect 對象
- Pygame詳解(十二):Surface 對象
- Pygame詳解(十三):time 模塊
- Pygame詳解(十四):music 模塊
- Pygame詳解(十五):pygame 模塊
- Pygame詳解(十六):cursors 模塊
- Pygame詳解(十七):joystick 模塊
- Pygame詳解(十八):mask 模塊
- Pygame詳解(二十一):BufferProxy 對象
- Pygame詳解(二十三):gfxdraw 模塊
- Pygame詳解(二十五):Overlay 對象
- Pygame詳解(二十八):sndarray 模塊
- Pygame詳解(三十一):camera 模塊
- Pygame詳解(三十二):cdrom 模塊
- Pygame詳解(三十六):version 模塊
- pygame rect相關知識
- Tkinter詳解
- Tkinter 組件詳解(一):Label
- Tkinter 組件詳解(二):Button