Python-变量和数据类型

定义一个变量就是定义了一个指针! ٩(ˊᗜˋ*)و
字符串内容很多,就很烦(っ ̯ -。)



变量和数据类型


一. 变量

一、关于变量

  1. 变量存储在内存中的值。这就意味着在创建变量时会在内存中开辟一个空间
  2. 基于变量的数据类型,解释器会分配指定内存,并决定什么数据可以被存储在内存中。
  3. Python 中的变量不需要声明。每个变量在使用前都必须赋值,变量赋值以后该变量才会被创建。
  4. 在 Python 中,变量就是变量,它没有类型,我们所说的”类型”是变量所指的内存中对象的类型。

二、变量的赋值

  1. Python 中的变量赋值不需要类型声明
  2. 每个变量在内存中创建,都包括变量的标识,名称和数据这些信息。
  3. 每个变量在使用前都必须赋值,变量赋值以后该变量才会被创建。
  4. 变量的赋值分为:单个变量赋值多个变量赋值

单个变量赋值:使用等号(=)运算符左边是一个变量名,等号(=)运算符右边是存储在变量中的值。例如:

1
2
message = "Hello Python world!"
print(message)

我们添加了一个名为message的变量。每个变量都存储了一个——与变量相关联的信息。在这里,存储的值为文本“Hello Python world!”。


多个变量赋值:

1
2
a = b = c = 1
#以上实例,创建一个整型对象,值为1,三个变量被分配到相同的内存空间上。

或者

1
2
a, b, c = 1, 2, "john"
#以上实例,两个整型对象 1 和 2 分别分配给变量 a 和 b,字符串对象 "john" 分配给变量 c。

 
三、变量的命名和使用

请务必牢记下述有关变量的规则:

  1. 变量名只能包含字母、数字下划线。变量名可以字母或下划线打头,但不能以数字打头,例如,可将变量命名为message_1,但不能将其命名为1_message。
  2. 变量名不能包含空格,但可使用下划线来分隔其中的单词。例如,变量名greeting_message可行,但变量名greeting message会引发错误。
  3. 不要将Python关键字和函数名用作变量名,即不要使用Python保留用于特殊用途的单词,如print。
  4. 变量名应既简短又具有描述性。例如,name比n好,student_name比s_n好,name_length比length_of_persons_name好。
  5. 慎用小写字母l和大写字母O,因为它们可能被人错看成数字1和0。
  6. 注意:就目前而言,应使用小写的Python变量名。在变量名中使用大写字母虽然不会导致错误,但避免使用大写字母是个不错的主意。

 
四、变量是一种动态语言
 
代码示例:

1
2
3
4
5
6
7
8
9
# -*- coding: utf-8 -*-
a = 123 # a是整数
print(a)
a = 'ABC' # a变为字符串
print(a)

运行结果:
123
ABC

 
这种变量本身类型不固定的语言称之为动态语言,与之对应的是静态语言。和静态语言相比,动态语言更灵活,就是这个原因。静态语言在定义变量时必须指定变量类型,如果赋值的时候类型不匹配,就会报错。例如Java是静态语言,赋值语句如下(// 表示注释):

1
2
int a = 123; // a是整数类型变量
a = "ABC"; // 错误:不能把字符串赋给整型变量

 
五、Python的变量是Python的指针

可参考:[一切都是对象,一切都是指针,一切都是东西(python的编程哲学)]
 
如下代码:

1
2
3
4
5
6
7
8
a=5
a=5
print(id(a))
print(id(5))

运行输出:
1769134320
1769134320

 
我们分别查一下他们的内存地址,发现地址是一样的。

于是我们可以这样理解:

  1. python把一切数据,一切的一切都看作对象,在python中,没有变量,只有指针,要说变量,也是指针变量
  2. 这样的变量还有如:列表字典的值
  3. 但是字符串,数字等类型的变量,字典的键就是传值使用,不是指针,而是不可再改变的值

 
举例子
例子1:当我们写:

1
a = 'ABC'

时,Python解释器干了两件事情:

  1. 在内存中创建了一个’ABC’的字符串;
  2. 在内存中创建了一个名为a的变量,并把它指向’ABC’

 
例子2:

1
2
3
4
5
6
7
8
# -*- coding: utf-8 -*-
a = 'ABC'
b = a
a = 'XYZ'
print(b)

运行结果:
ABC

最后一行打印出变量b的内容到底是**'ABC'呢还是'XYZ'?如果从数学意义上理解,就会错误地得出ba相同,也应该是'XYZ',但实际上b的值是'ABC'**,让我们一行一行地执行代码,就可以看到到底发生了什么事:

  1. 执行a = ‘ABC’,解释器创建了字符串’ABC’和变量a,**并把a指向’ABC’**:

1.png

  1. 执行b = a,解释器创建了变量b,并把b指向a指向的字符串’ABC’:

0 (1).png

  1. 执行a = ‘XYZ’,解释器创建了字符串’XYZ’,并把a的指向改为’XYZ’,但b并没有更改:

0 (2).png

所以,最后打印变量b的结果自然是’ABC’了。


二. 常量

所谓常量就是不能变的变量,比如常用的数学常数π就是一个常量。在Python中,通常用全部大写的变量名表示常量

1
PI = 3.14159265359

但事实上PI仍然是一个变量,Python根本没有任何机制保证PI不会被改变,所以,用全部大写的变量名表示常量只是一个习惯上的用法,如果你一定要改变变量PI的值,也没人能拦住你。

三. 数据类型

标准数据类型

在内存中存储的数据可以有多种类型。

Python 定义了一些标准类型,用于存储各种类型的数据。

Python有五个标准的数据类型:

  1. Numbers(数字)
  2. String(字符串)
  3. List(列表)
  4. Tuple(元组)
  5. Dictionary(字典)

3.1 数字运算和函数

一、整数的定义和基础知识

  1. Python可以处理任意大小的整数,当然包括负整数,在程序中的表示方法和数学上的写法一模一样,例如:1,100,-8080,0,等等。

  2. 计算机由于使用二进制,所以,有时候用十六进制表示整数比较方便,十六进制用0x前缀和0-9,a-f表示,例如:0xff00,0xa5b4c3d2,等等。


二、整数运算

在Python中,可对整数执行加(**+)减(-)乘(*)除(/**)平方(**)取余(%)运算。


注意事项:

  1. Python使用两个乘号表示乘方运算:3 ** 2==9
  2. Python整数的除法得到的结果是精确的。在Python中,有两种除法:
    1. 一种除法是/(结果是浮点数)
    2. 另一种是除法是//,称为地板除(两个整数的除法仍然是整数)
  3. 因为**//**除法只取结果的整数部分,所以Python还提供一个余数运算(%),可以得到两个整数相除的余数。

 
示例代码:

1
2
3
4
5
6
7
8
9
10
11
a=10/3
print(a)
a=10//3
print(a)
a=10%3
print(a)

运算结果:
3.3333333333333335
3
1

三、Number 类型转换

||
:-|:-|
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 转换为一个列表
chr(x ) |将一个整数转换为一个字符
unichr(x ) |将一个整数转换为Unicode字符
ord(x ) |将一个字符转换为它的整数值
hex(x ) |将一个整数转换为一个十六进制字符串
oct(x ) |将一个整数转换为一个八进制字符串


四、数学函数

函数 返回值 ( 描述 )
abs(x) 返回数字的绝对值,如abs(-10) 返回 10
ceil(x) 返回数字的上入整数,如math.ceil(4.1) 返回 5
cmp(x, y) 如果 x < y 返回 -1, 如果 x == y 返回 0, 如果 x > y 返回 1
exp(x) 返回e的x次幂(ex),如math.exp(1) 返回2.718281828459045
fabs(x) 返回数字的绝对值,如math.fabs(-10) 返回10.0
floor(x) 返回数字的下舍整数,如math.floor(4.9)返回 4
log(x) 如math.log(math.e)返回1.0,math.log(100,10)返回2.0
log10(x) 返回以10为基数的x的对数,如math.log10(100)返回 2.0
max(x1, x2,…) 返回给定参数的最大值,参数可以为序列。
min(x1, x2,…) 返回给定参数的最小值,参数可以为序列。
modf(x) 返回x的整数部分与小数部分,两部分的数值符号与x相同,整数部分以浮点型表示。
pow(x, y) x**y 运算后的值。
round(x [,n]) 返回浮点数x的四舍五入值,如给出n值,则代表舍入到小数点后的位数。
sqrt(x) 返回数字x的平方根

五、随机数函数

随机数可以用于数学,游戏,安全等领域中,还经常被嵌入到算法中,用以提高算法效率,并提高程序的安全性。

Python包含以下常用随机数函数:

函数 描述
choice(seq) 从序列的元素中随机挑选一个元素,比如random.choice(range(10)),
从0到9中随机挑选一个整数。
randrange ([start,] stop [,step]) 从指定范围内,按指定基数递增的集合中获取一个随机数,
基数缺省值为1
random() 随机生成下一个实数,它在[0,1)范围内。
seed([x]) 改变随机数生成器的种子seed。如果你不了解其原理,你不必特别去设定seed,
Python会帮你选择seed。
shuffle(lst) 将序列的所有元素随机排序
uniform(x, y) 随机生成下一个实数,它在[x,y]范围内。

六、三角函数

函数 描述
acos(x) 返回x的反余弦弧度值。
asin(x) 返回x的反正弦弧度值。
atan(x) 返回x的反正切弧度值。
atan2(y, x) 返回给定的 X 及 Y 坐标值的反正切值。
cos(x) 返回x的弧度的余弦值。
hypot(x, y) 返回欧几里德范数 sqrt(xx + yy)。
sin(x) 返回的x弧度的正弦值。
tan(x) 返回x弧度的正切值。
degrees(x) 将弧度转换为角度,如degrees(math.pi/2) , 返回90.0
radians(x) 将角度转换为弧度

七、数学常量

函数 描述
pi 数学常量 pi(圆周率,一般以π来表示)
e 数学常量 e,e即自然常数(自然常数)。

八、 range()函数

Python3 range() 函数返回的是一个可迭代对象(类型是对象),而不是列表类型, 所以打印的时候不会打印列表。

Python3 list() 函数是对象迭代器,可以把range()返回的可迭代对象转为一个列表,返回的变量类型为列表。

Python2 range() 函数返回的是列表。

[Python3 内置函数]&emsp;[Python3 range() 函数用法]


函数语法:
range(stop)
range(start, stop[, step])


参数说明:
start: 计数从 start开始。默认是从 0 开始。例如range(5)等价于range(0, 5);
stop: 计数到 stop 结束,但不包括 stop。例如:range(0, 5) 是[0, 1, 2, 3, 4]没有5
step:步长,默认为1。例如:range(0, 5) 等价于 range(0, 5, 1)



3.2 浮点数

  1. 浮点数也就是小数,之所以称为浮点数,是因为按照科学记数法表示时,一个浮点数的小数点位置是可变的,比如,1.23x10^9和12.3x10^8是完全相等的。浮点数可以用数学写法,如**1.233.14-9.01,等等。但是对于很大或很小的浮点数,就必须用科学计数法表示,把10用e替代,1.23x109就是1.23e9,或者12.3e8,0.000012可以写成1.2e-5**,等等。

  2. 整数和浮点数在计算机内部存储的方式是不同的,整数运算永远是精确的(除法难道也是精确的?是的!),而浮点数运算则可能会有四舍五入的误差。


3.3 字符串

1.定义字符串并输出
  1. 区分单引号和双引号:字符串是以单引号**'或双引号"括起来的任意文本,比如'abc'"xyz"等等。
    请注意
    ''""本身只是一种表示方式,不是字符串的一部分,因此,字符串'abc'只有abc这3个字符。如果'本身也是一个字符,那就可以用""括起来,比如"I'm OK"包含的字符是I'm空格OK**这6个字符。
    单引号要放到双引号里面,双引号要放到单引号里面

  1. 使用转义字符“\如果字符串内部既包含**'又包含"怎么办?可以用转义字符\**来标识,比如:
1
2
3
4
5
a='I\'m \"OK\"!'
print(a)

运行输出:
I'm "OK"!

把双引号括在单引号里面,但是下面的单引号必须转义,如下也是正确的:

1
2
a='I\'m "OK"!'
print(a)

  1. 使用不转义字符“r''如果字符串里面有很多字符都需要转义,就需要加很多**\,为了简化,Python还允许用r''表示,''内部的字符串默认不转义**,可以自己试试:
1
2
3
4
5
6
7
8
9
a='\\\t\\'
print(a)

a=r'\\\t\\'
print(a)

输出结果:
\ \
\\\t\\

  1. 在字符串里面有换行,将字符串按照换行输出。使用''' 内容 '''如果字符串内部有很多换行,用**\n写在一行里不好阅读,为了简化,Python允许用''' 这里写内容'''**的格式表示多行内容,可以自己试试:
1
2
3
4
5
6
7
8
9
10
11
a='''hello
world
line1
line2'''
print(a)

运行输出:
hello
world
line1
line2

  1. 在字符串里面有换行,将字符串按照换行输出,并且不转义输出字符。使用r''' '''
1
2
3
4
5
6
7
8
9
10
11
a=r'''hello \n
world
line1
line2'''
print(a)

运行输出:
hello \n
world
line1
line2

2.使用字符串(取下标)

python的字串列表有2种取值顺序:

  1. 从左到右索引默认0开始的,最大范围是字符串长度少1
  2. 从右到左索引默认-1开始的,最大范围是字符串开头。

python-string-slice.png

  1. 如果你要实现从字符串中获取一段子字符串的话,可以使用 [头下标:尾下标] 来截取相应的字符串,其中下标是从 0 开始算起,可以是正数或负数,下标可以为空表示取到头或尾。
  2. [头下标:尾下标] 获取的子字符串包含头下标的字符,但不包含尾下标的字符

比如:

1
2
3
4
5
6
7
s = 'abcdef'
print(s[2])
print(s[1:5])

运行结果:
c
bcde

当使用以冒号**:**分隔的字符串,python 返回一个新的对象,结果包含了以这对偏移标识的连续的内容,左边的开始是包含了下边界。
上面的结果包含了 s[1] 的值 b,而取到的最大范围不包括尾下标,就是 s[5] 的值 f。

9aU.png


3.加号(+)星号(*)冒号(:)
  1. 加号(+):拼接字符串;
  2. 星号(*):重复操作;
  3. 冒号(:):截取字符。

  1. Python使用加号( + )来合并字符串
1
2
3
4
5
6
7
first_name = "ada"
last_name = "lovelace"
full_name = first_name + " " + last_name
print("Hello, " + full_name + "!")

运行结果:
Hello, ada lovelace!

  1. Python使用星号( * )来重复字符串
1
2
3
4
5
6
str = 'Hello World!'
a=str*2
print(a)

运行输出:
Hello World!Hello World!

  1. Python使用冒号( : )来截取字符
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#!/usr/bin/python
# -*- coding: UTF-8 -*-

str = 'Hello World!'

print str # 输出完整字符串
print str[0] # 输出字符串中的第一个字符
print str[2:5] # 输出字符串中第三个至第五个之间的字符串
print str[2:] # 输出从第三个字符开始的字符串
print str * 2 # 输出字符串两次
print str + "TEST" # 输出连接的字符串

以上实例输出结果:
Hello World!
H
llo
llo World!
Hello World!Hello World!
Hello World!TEST

Python 列表截取可以接收第三个参数,参数作用是截取的步长,以下实例在索引 1 到索引 4 的位置并设置为步长为 2(间隔一个位置)来截取字符串:

python_list_slice_2.png


4.常用的字符串方法
1. 修改字符串的大小写

使用方法:

  1. **upper()**:将字符串所有字母大写
  2. **lower()**:将字符串所有字母小写
  3. **title()**:将字符串所有单词首字母大写,并将单词中除了首字母的变为小写

示例代码:

1
2
3
4
5
6
7
8
9
name = "Hexo lovelace giTHub toMMrow n"
print(name.upper())
print(name.lower())
print(name.title())

运行输出:
HEXO LOVELACE GITHUB TOMMROW N
hexo lovelace github tommrow n
Hexo Lovelace Github Tommrow N

在**name.title()** 中,name 后面的句点( . )让Python对变量name 执行方法title() 指定的操作。每个方法后面都跟着一对括号,这是因为方法通常需要额外的信息来完成其工作。这种信息是在括号内提供的。函数title() 不需要额外的信息,因此它后面的括号是空的。


2. 暂时/永久删除字符串两端空白

使用方法:

  1. strip():删除字符串两端空白或换行符;
  2. lstrip():删除字符串端空白或换行符;
  3. rstrip():删除字符串端空白或换行符;

暂时或者是永久删除的区别是在于调用方法后是否重新赋值给一个变量:

  1. 不赋值:暂时删除,下次调用时还是原字符串
  2. 重新赋值:永久删除

示例代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
name = "    HexoAndGithub  "

print(name)
print(name.strip())
print(name.rstrip())
print(name.lstrip())
print(name)

print('\n')
name = name.strip()
print(name)
print(name.strip())
print(name.rstrip())
print(name.lstrip())
print(name)

运行结果:
HexoAndGithub
HexoAndGithub
HexoAndGithub
HexoAndGithub
HexoAndGithub


HexoAndGithub
HexoAndGithub
HexoAndGithub
HexoAndGithub
HexoAndGithub

3. 内置函数 len()返回字符串长度

内置函数 len() 返回字符串长度,注意,它并不是字符串的方法!!!

1
2
3
4
5
6
7
8
a = 'supercalifragilisticexpialidocious'
b = len(a)
print(a)
print(b)

运行结果:
supercalifragilisticexpialidocious
34

3.4 布尔值

  1. 布尔值和布尔代数的表示完全一致,一个布尔值只有**TrueFalse**两种值,要么是True,要么是False;

  2. 在Python中,True、False首字母必须大写。可以直接用True、False表示布尔值,请注意大小写,也可以通过布尔运算计算出来:

1
2
3
4
5
6
a=True
b=3>2
print(a,b)

运行结果:
True True

  1. 布尔值可以用andornot运算
    1. and运算是与运算,只有所有都为True,and运算结果才是True
    2. or运算是或运算,只要其中有一个为True,or运算结果就是True
    3. not运算是非运算,它是一个单目运算符,把True变成False,False变成True s

1
2
3
4
5
6
7
8
9
10
11
a= 5 > 3 and 3 < 1
b= 5 > 3 or 1 > 3
c= not 1 > 2
print(a)
print(b)
print(c)

运行结果:
False
True
True