[TOC]
# 變量
變量是內存中用于存儲數據的基本單位!
## 什么是變量?
概念: 變量是內存中用于存儲數據的基本單位! 變量會暫時性的存儲放入的數據!
**數學角度**
>數學中
>x + y = 10
>x=5 y=?
>x和y就是變量,它們就是數學中的變量!
**變量聲明語法**

> 變量名字學名叫標識符
> 該表達式正確讀法: 值42賦值給變量 answer
> 可以直接使用名字,調用內存中保存的值
**案例**
```
# 變量
answer = 42
print(answer);
print("變量的值:", answer);
# 使用變量接收用戶輸入的數據
uname = input("請輸入你的名字:")
print("姓名:",uname)
age = input("請輸入你的年齡:")
print("年齡:",age)
#多個變量同時賦值
a = b = c = 1
或
a, b, c = 1, 2, "runoob"
```
**生活角度理解**
變量是內存中存儲數據的最小單位.
> 變量= 生活中的容器
> 變量賦值操作 = 我們把物品放入容器
> 數據類型= 取決于我們在容器中放的物品
內存中保存變量的過程和人住賓館過程相同!



變量定義語法: *標識符/變量名 = 值*
## 變量名規范
**1. 變量名嚴格區分大小寫**
**2.變量名可重復**
> Python是弱數據類型語言.可以理解為不嚴格區分數據的具體類型! 任意類型都可以儲存在一個變量中!
**3. 變量名由字母數字下劃線組成,首字母不能為數字**

**4 駝峰命名法或帕斯卡命名法**

> 小駝峰: zhangSan userName, dogName 首字母小寫,每個新單詞首字母大寫
> 大駝峰: ZhangSan UserName, DogName 每個單詞首字母都大寫
> 帕斯卡命名法: zhangsan-name 或 zhangsan_name 多個單詞之間用中劃線或下劃線隔開也常用!
**5 簡短清晰見名知意盡量用英文避免用中文**
**6 不能和內置關鍵字沖突**
**7 變量只定義未賦值報錯**
```
#變量未賦值就使用報錯
print(a);
報錯
NameError: name 'a' is not defined
````
> 系統保留關鍵字
> False, None, True, and, as , assert, break, class, continue, def, del,elif,else,except,finally,for,form,global,if,import, in,is , lambda, nonlocal,not,nor,pass,raise,return, try,while,with,yield
## 變量交換
> #兩個變量交換值操作
> 變量1,變量2= 變量2,變量1
> a = 1
> b =2
> a,b= b,a
## print()函數/命令
> 打印是Python中常用功能,顧名思義, print()理解為打印展示的結果!使用該方法把你要打印查看結果的對象塞入括號中,就可以打印出來! (Python2.x 無括號)

- print(內容)
- prin(變量)
- print(變量1,變量2,變量3...); 打印多個值用逗號隔開
- print("提示內容:", 變量名) ;
**案例**
```
#在txt文檔中打印內容
file = open("d:/demo.txt","w");
file.write("你好,我新寫入的內容")
```
## 變量的3個常用操作
**1 獲取變量的值-直接通過名字獲取**
> 用法: num1=3; print(num1)
**2獲取數據類型 type()函數**
> 用法: type(變量名)
**3 獲取變量在內存中的id標識id()函數**
> 用法 id(變量名)
```
# 根據名字直接
num1= 30;
print(num1)
# 查看數據類型
print(type(num1))
num1 = "33"
print(type(num1))
num1 = 3.3
print(type(num1))
# 查看內存地址
print(id(num1))
```
# 數據類型
Python3 中有六個標準的數據類型:
- Number(數字)
- String(字符串)
- List(列表)
- Tuple(元組)
- Set(集合)
- Dictionary(字典)
Python3 的六個標準數據類型中:
- 不可變數據(3 個):Number(數字)、String(字符串)、Tuple(元組);
- 可變數據(3 個):List(列表)、Dictionary(字典)、Set(集合)。
>在Python中我們不需要聲明一個變量的數據類型,只需要定義它并為它賦值,因為系統會根據值自動分辨它的數據類型
數據的信息查看
> 內存標識: id()
類型檢測: type()
值的使用: 直接使用
## Number(數字)

>Python3 支持 int、float、bool、complex(復數)。
在Python 3里,只有一種整數類型 int,表示為長整型,沒有 python2 中的 Long。
像大多數語言一樣,數值類型的賦值和計算都是很直觀的。
內置的 type() 函數可以用來查詢變量所指的對象類型。
```
a, b, c, d = 20, 5.5, True, 4+3j
print(type(a), type(b), type(c), type(d))
<class 'int'> <class 'float'> <class 'bool'> <class 'complex'>
```
### 類型判斷
**變量類型判斷 type和isinstance**
> 此外還可以用 isinstance 來判斷:
>isinstance(變量,測試的類型) 檢測一個暑假是否由指定的類型創建
```
# 判斷是否為整數
a = 111;
print(isinstance(a,int))
```
>isinstance 和 type 的區別在于:
區別就是:
type()不會認為子類是一種父類類型。
isinstance()會認為子類是一種父類類型。
```
class A:
pass
class B(A):
pass
isinstance(A(), A) # returns True
type(A()) == A # returns True
isinstance(B(), A) # returns True
type(B()) == A # returns False
```
注意:在 Python2 中是沒有布爾型的,它用數字 0 表示 False,用 1 表示 True。到 Python3 中,把 True 和 False 定義成關鍵字了,但它們的值還是 1 和 0,它們可以和數字相加。
### del刪除引用
**del 刪除變量引用**
>您也可以使用del語句刪除一些對象引用,
>語法 del var1[,var2[,var3[....,varN]]]]
### 自動轉換
```
#通過控制臺輸入的所有數據都為字符串
num1 = input("請輸入一個數:")
print(int(num1)+ 2); #不轉換為整數運算出錯
```
### 案例
```
# 數字類型
print(type(3))
print(type(3.13))
print(type(3j)) # 科學家用
# 判斷是否為整數
a = 111;
print(isinstance(a,int))
# 刪除變量引用
num1 =30
print("num1的值:",num1)
del num1
print("num1的值:",num1)
print("num1的值:"+"aaa")
# 數字交換
a = 3;
b = 4;
a,b = b,a;
print("a結果:",a)
print("b結果:",b)
# 混合運算時整數會自動變為小數
num1= 3;
num2= 1.3;
jieguo = num1/num2;
print(type(jieguo))
```
### 注意
- 1、Python可以同時為多個變量賦值,如a, b = 1, 2。
- 2、一個變量可以通過賦值指向不同類型的對象。
- 3、數值的除法包含兩個運算符:/ 返回一個浮點數,// 返回一個整數。
- 4、在混合計算時,Python會把整型轉換成為浮點數。
## 字符串String
字符串或串(String)是由數字、字母、下劃線組成的一串字符,它是編程語言中表示文本的數據類型.

### 定義
**字符串定義**
```
print(type('123'))
print(type("123"))
print(type('''123'''))
print(type("""123"""))
# 轉義符 \n
print("窗前明月光\n \'疑是地上霜\'")
```
### 連接和重復
**+表示鏈接 * 表示重復**
都是字符串類型才可以使用 `+` 連接
```
# 字符串連接
name="張三"
sex="男"
age="20" #注意 age必須為整數!否則無法實現合并
print(name+sex+age)
num1 = 1
str2 ='1'
num2 = int(str2) #被轉換為同種類型后就可以合并兩個變量了
print(num1+num2)
words = "ABC"
print(words*3) #結果ABCABCABC
```
### 截取
**字符串截取(學名叫分片)**
字符串可以通過s `tring[開始位置 : 結束位置 ]` 的方式進行索引,分片slice,也就是加一個 `[]` ,字符串分片(silice)實際上可以看做是從字符串中找到你要截取的東西,復制出來一小段你要的長度,存儲在另個地方,而不會對原字符串進行更改!

### 常用方法
**字符串常用方法**
方法:
>Python是面向對象進行編程的語言,而對象擁有各種功能,特征,專業術語稱之為---方法(method).比如:日常生活中的車是對象 `car`,車有很多特性和功能, 比如`駕駛` `開車門` `開車燈` 等,在Python編程中可以描述成這樣:
```
car.drive()
car.door.open()
car.light()
```

字符串常用的方法
- `replace(待替換字符串,新字符串)` 替換
- `len(字符串)`長度
- `find(字符串)` 查找,找不到返回-1
- `format` 格式化
真實應用:



**字符串長度len()**
len(字符串/變量) 可獲取字符串長度
```
print(len("abc def")) #打印長度為7
```
### 案例
```
#+連接 * 重復
num1 = 1
str2 ='1'
num2 = int(str2) #被轉換為同種類型后就可以合并兩個變量了
print(num1+num2)
words = "ABC"
print(words*3)
#長度len()
print("長度:",len("abc def")) #打印長度為7
#截取
s = 'ilovepython'
print("結果:",s[1:5]) #包頭不包尾
print("結果:",s[1:])
name= 'My name is Mike'
print(name[0]) #M
print(name[-1]) #從后往前取e
print(name[3:7])#包頭不包尾
print(name[3:])#后面的全貌
print(name[:5])#5之前的
#真實應用
url = 'http://www.jd.com/14d2e8ejw1exjogbxdxhj20ci0kuwex.jpg'
print(url[-10:])
#替換replace,find查找
# 手機號碼只顯示后4位,其余用*替換
phone = '17600950805'
print(phone.replace(phone[:7],"*"*9))
search='176'
print(search +'開始:'+ str(phone.find(search)) +'到'+(str(phone.find(search)+ len(search))) )
# 格式化
print("我的名字叫:{},年齡是:{}".format('張三',20))
#真實應用
keyword="python3"
url = "您要查找的網址是:http://www.runoob.com/{}/{}-tutorial.html".format(keyword,keyword)
print(url)
```
### 轉義字符
>特殊格式的字符串需要用轉義字符表示,參考一下列表
| 轉義字符 | 描述 |
| --- | --- |
| \(在行位) | 續行符 |
| \\ | 反斜杠 |
| \' | 單引號 |
| \'' | 雙引號 |
| \'' | 雙引號 |
| \n | window系統換行 |
| \n \r | Linux系統換行 |
| \t | 橫向制表符|
# 數據類型轉換
將數據從當前類型變為其他類型的過程叫 數據類型轉換.
我們需要對數據內置的類型進行轉換,數據類型的轉換,你只需要將數據類型作為函數名即可。
>語法 數據類型名()
**數據類型轉換分兩大類**
>自動數據類型轉換 (隱士) 程序自動完成
>強制數據類型轉換(顯示) 必須用戶強制轉化
>(比如從控制臺輸入的數字也是字符串類型)
```
#現在常用
int(3.6) #結果3
float(3) #結果3.0
int('3.3') #結果3
str(3) #變為字符串類型
num1 = 3;
num2 = 1.0
jieguo= num1/num2; # 自動變為更加精確的小數類型
```
### 自動轉換
>運算時程序自動完成
特征
>1. 程序自動進行,不需要人工干預
>2. 發生在運算或判斷工程中
>3. 類型轉換向著更加精確的類型進行轉換
### 強制轉換
> 根據程序需要,程序員通過操作強制改變數據類型! 過程可見
> 常用功能
> int( 變量) 強制將數據轉化為整數
> float(變量) 強制將數據轉化為浮點型
> str(變量) 強制將數據轉化為字符串
> 等....
以下幾個內置的函數可以執行數據類型之間的轉換。這些函數返回一個新的對象,表示轉換的值。
| 函數 | 描述 |
| --- | --- |
| int(x [,base]) | 將x轉換為一個整數 |
| long(x [,base] ) | 將x轉換為一個長整數
| float(x) | 將x轉換到一個浮點數|
| complex(real [,imag]) | 創建一個復數|
| str(x) | 將對象 x 轉換為字符串|
| repr(x) | 將對象 x 轉換為表達式字符串 |
| eval(str) | 用來計算在字符串中的有效Python表達式,并返回一個對象 |
| tuple(s) | 將序列 s 轉換為一個元組 |
| list(s) | 將序列 s 轉換為一個列表 |
| set(s) | 轉換為可變集合 |
| dict(d) | 創建一個字典。d 必須是一個序列 (key,value)元組。 |
| frozenset(s) | 轉換為不可變集合 |
| chr(x) | 將一個整數轉換為一個字符 |
| unichr(x) | 將一個整數轉換為Unicode字符 |
| ord(x) | 將一個字符轉換為它的整數值 |
| hex(x) | 將一個整數轉換為一個十六進制字符串 |
| oct(x) | 將一個整數轉換為一個八進制字符串 |
# 列表 list 常用


# 元組(Tuple)

# 字典(Dictionary)

# 集合(Set)

# 運算符
1. 算術運算符(+ , - , * , / , %) %取余講解
2. 比較/關系運算符(> < >= <= != ==)
3. 賦值 = +=練習 (= 和 +=)
4. 邏輯運算符:(and or not )
5. 位運算符: ( & | 左移 右移)
6. 成員運算符 (in , not in)
8. 身份運算符( is , is not)
9. 優先級: 使用小括號
## 位運算符講解

```
# 小數對大數取余結果=小數
print(10%30)
# num = num +3; 簡寫 num+=3;
num =3;
num +=3;
print(num)
# and 兩個都成立返回true or 其中一個成立返回true
age1 = 20;
age2= 32;
jieguo = age1>18 and age2>18
jieguo = age1>18 or age2>18
print(jieguo)
# &與 |或 <<左移動 >>右移 判斷二進制數據的
a = 60 # 60 = 0011 1100
b = 13 # 13 = 0000 1101
#按位與 (位置)
print(a & b) ; # 12 = 0000 1100
print(a | b); # 61 = 0011 1101
print(a << 2) ; # 240 = 1111 0000
print(a >> 2) ; # 15 = 0000 1111
#成員
a = 2
list = [1, 2, 3, 4, 5 ];
print(a in list)
# 身份 is是判斷兩個標識符是不是引用自一個對象
a = 20
b = 20
print( '成立么:', a is b)
print( '成立么:', id(a) == id(b))
```