[TOC]
# 变量
变量是内存中用于存储数据的基本单位!
## 什么是变量?
概念: 变量是内存中用于存储数据的基本单位! 变量会暂时性的存储放入的数据!
**数学角度**
>数学中
>x + y = 10
>x=5 y=?
>x和y就是变量,它们就是数学中的变量!
**变量声明语法**
![变量语法](https://box.kancloud.cn/9cf45849fc487c07132eff5f508ea142_921x430.png)
> 变量名字学名叫标识符
> 该表达式正确读法: 值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"
```
**生活角度理解**
变量是内存中存储数据的最小单位.
> 变量= 生活中的容器
> 变量赋值操作 = 我们把物品放入容器
> 数据类型= 取决于我们在容器中放的物品
内存中保存变量的过程和人住宾馆过程相同!
![宾馆](https://box.kancloud.cn/34da0fd1993f754af5d520b6aa8d3f26_757x375.png)
![内存数据存储](https://box.kancloud.cn/676167ae58bd4787b17024fe10521822_782x500.png)
![定义类比](https://box.kancloud.cn/903e32c2db8d3ade77983f47204c5fe5_745x474.png)
变量定义语法: *标识符/变量名 = 值*
## 变量名规范
**1. 变量名严格区分大小写**
**2.变量名可重复**
> Python是弱数据类型语言.可以理解为不严格区分数据的具体类型! 任意类型都可以储存在一个变量中!
**3. 变量名由字母数字下划线组成,首字母不能为数字**
![案例](https://box.kancloud.cn/aa9b0b2c8d0d7e1000996031f10cf803_553x348.png)
**4 驼峰命名法或帕斯卡命名法**
![驼峰命名法](https://box.kancloud.cn/b9e948f534050cd007a2abf404ac30fb_482x335.png)
> 小驼峰: 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 无括号)
![打印](https://box.kancloud.cn/eab7a4c8d272d1a8401d907f7c77c883_442x162.png)
- 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(数字)
![](https://box.kancloud.cn/e65e44ec5d0b7f005ab0ed541e9fd857_778x419.png)
>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)是由数字、字母、下划线组成的一串字符,它是编程语言中表示文本的数据类型.
![](https://box.kancloud.cn/d4f291d177f8c278b2e418d771fcb042_607x481.png)
### 定义
**字符串定义**
```
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)实际上可以看做是从字符串中找到你要截取的东西,复制出来一小段你要的长度,存储在另个地方,而不会对原字符串进行更改!
![字符串](https://box.kancloud.cn/5e4924d0dd21113bb1e723c862c64b7a_758x141.png)
### 常用方法
**字符串常用方法**
方法:
>Python是面向对象进行编程的语言,而对象拥有各种功能,特征,专业术语称之为---方法(method).比如:日常生活中的车是对象 `car`,车有很多特性和功能, 比如`驾驶` `开车门` `开车灯` 等,在Python编程中可以描述成这样:
```
car.drive()
car.door.open()
car.light()
```
![方法](https://box.kancloud.cn/a436b5b292f4740cc2631c86c50c9d09_643x312.png)
字符串常用的方法
- `replace(待替换字符串,新字符串)` 替换
- `len(字符串)`长度
- `find(字符串)` 查找,找不到返回-1
- `format` 格式化
真实应用:
![替换应用](https://box.kancloud.cn/e26e260c11aca10c139034e85a03dc9e_707x234.png)
![查找应用](https://box.kancloud.cn/1bdc2464f32a975756dba153fa123979_723x210.png)
![格式化应用](https://box.kancloud.cn/635e9048cbd32e4cc9bceb842f9f70c7_598x221.png)
**字符串长度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 常用
![](https://box.kancloud.cn/fed31015ebbd6ef6659e57891ce1fddb_778x210.png)
![](https://box.kancloud.cn/db75a0654e8d0ad4146f24f1517d1b0b_706x191.png)
# 元组(Tuple)
![](https://box.kancloud.cn/88d20ad317e0b5b0db56a8161f609299_767x163.png)
# 字典(Dictionary)
![](https://box.kancloud.cn/21e772ab2edb471eba9e1934a71a34c0_768x570.png)
# 集合(Set)
![](https://box.kancloud.cn/2effa284c880da5f0013cbc9b2b826c8_761x434.png)
# 运算符
1. 算术运算符(+ , - , * , / , %) %取余讲解
2. 比较/关系运算符(> < >= <= != ==)
3. 赋值 = +=练习 (= 和 +=)
4. 逻辑运算符:(and or not )
5. 位运算符: ( & | 左移 右移)
6. 成员运算符 (in , not in)
8. 身份运算符( is , is not)
9. 优先级: 使用小括号
## 位运算符讲解
![位运算符](https://box.kancloud.cn/165861cf7a9382f4093f2f2c48b5b26a_756x352.png)
```
# 小数对大数取余结果=小数
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))
```