变量(variable)
Python中什么是变量
1、在Python中,变量的概念基本上和初中代数的方程变量是一致的 ⑴例如,对于方程式 y=x*x ,x就是变量。当x=2时,计算结果是4,当x=5时,计算结果是25 ⑵只是在计算机程序中,变量不仅可以是数字,还可以是任意数据类型 2、变量代表某个值的名字,是指向各种类型值的名字,以后用到这个值时,直接引用名字即可,不用再写具体的值
创建变量
1、每个变量在使用前都必须赋值(否则会报错),变量赋值以后,该变量才会被创建:变量名 = 值 ⑴等号"=":赋值操作符,用来给变量赋值,左边是变量名,右边是指,不能写反了 ⑵"="左边:是变量名(最好能做到见名知意) ⑶"="右边:是变量所指向的值 ⑷变量定义之后,后续就可以直接使用了
例1:
a = 3 #定义一个变量a,并给其赋值为3
注: 1、在Python中,一切都是对象,一切都是对象的引用
2、上面例子中,python将执行三个步骤来完成a = 3的赋值操作 ⑴创建也变量a ⑵创建一个对象(分配一块内存),来存储值3 ⑶将变量与对象,通过指针连接起来,从变量到对象的连接称之为引用(变量引用对象)
2、在Python中,定义变量是不需要指定数据类型的 ⑴变量类型是在运行过程中根据对象的类型自动决定的 ⑵但Python本身是有数据类型的,它的数据类型可分为数字型和非数字型 ①数字型:整型int、浮点型float、布尔bool、复数型complex(bool:布尔类型中用True和False表示真和假(非零即真)) ②非数字型:字符串、列表、元组、字典、集合
2.1、在Python 2.x版本中,根据保存数值的长度整型还分为整型(int)和长整型(long),而在Python 3.x版本中整型并没有区分整型(int)和长整型(long)
例2:
a = 4 #定义一个数字型的变量
b = "hello,world" #定义一个字符串型的变量
c = [1,2,3,4] #定义一个列表型变量
d = {"a":1} #定义一个字典型变量
print(type(a))
print(type(b))
print(type(c))
print(type(d))
"""
注:可以看到,在Python中定义变量时,直接使用赋值语句来定义就可以了
不需要指定变量的类型:变量类型由值的类型决定(变量名是没有类型的,值才有类型)
"""
3、在Python中,等号"="是赋值语句,可以把任意数据类型赋值给变量,同一个变量可以反复赋值,而且可以是不同类型的变量 ⑴一个变量在多次赋值后,会后面的值会覆盖前面的值例3:
a = 4 #定义一个数字型的变量
print(a)
print(type(a))
a = "hello,world" #定义一个字符串型的变量
print(a)
print(type(a))
a = [1,2,3,4] #定义一个列表型变量
print(a)
print(type(a))
"""
4
hello,world
[1, 2, 3, 4]
"""
注: 1、这种变量本身类型不固定的语言称之为动态语言(Python等),与之对应的是静态语言(JAVA等) ⑴静态语言在定义变量时必须指定变量类型,如果赋值的时候类型不匹配,就会报错。例如Java是静态语言,赋值语句如下(// 表示注释) ⑵int a = 123; // a是整数类型变量 ⑶a = "mooc"; // 错误:不能把字符串赋给整型变量 ⑷和静态语言相比,动态语言更灵活,就是这个原因
2、在上面的例子中,a开始是一个整数,然后变成一个字符串,最后变成一个列表 ⑴看起来,a的类型发生了三次改变,实上,在python中,变量没有类型,类型是属于对象的:即,值的类型决定了变量的类型 ⑵就像前面所说,a = 4,是变量a引用了对象4,而以上三条语句,实际上是变量a引用了不同类型的对象 ⑶当变量a重新赋值给字符串'hello,world'时,它的上一个引用对象4马上被回收了,对象的空间自动放入自由内存空间池,等待后来的对象使用(具体的垃圾回收就有点多了,就不介绍了)
3、不要把赋值语句的等号等同于数学的等号
例4:
x = 10 #"="表示赋值
x = x + 2
print(x)
y = 11
print(x==y) #"=="判断是否相等
"""
12
False
"""
注: 1、如果从数学上理解x = x + 2那无论如何是不成立的,在程序中,赋值语句先计算右侧的表达式x + 2,得到结果12,再赋给变量x。由于x之前的值是10,重新赋值后,x的值变成12
2、最后,理解变量在计算机内存中的表示也非常重要。当我们写:a = 'ABC'时,Python解释器干了两件事情: ⑴在内存中创建了一个'ABC'的字符串 ⑵在内存中创建了一个名为a的变量,并把它指向'ABC' ⑶也可以把一个变量a赋值给另一个变量b,这个操作实际上是把变量b指向变量a所指向的数据,例如下面的代码
例4_1:
a = 1
b = 2
c = a + b
print(a)
print(b)
print(c)
"""
1
2
3
"""
注: 1、变量是指向各种类型值的名字,代表某个值的名字
2、在python中等号"="是赋值语句,在python中可以把任意数据类型赋值给一个变量
3、上面例子中,a,b,c都是我们创建的变量名,=是赋值语句,1,2,a+b(1+2)是变量值。第一句话的意思就是,创建变量名a,并将其赋值为1
例5:
a = 'ABC'
b = a #先对b赋值,然后才改变的变量a值
a = 'XYZ'
print(a)
print(b)
"""
XYZ
ABC
"""
注:
变量的命名
1、 标识符:标识符就是在程序中定义的变量名和函数名 ⑴标识符可以由字母、下划线和数字组成 ⑵标识符不能以数字开头 ⑶标识符不能与关键字重名 ⑷标识符区分大小写 2、关键字:关键字就是在Python内部已经使用的标识符 ⑴查看Python关键字 例6:
import keyword
print(keyword.kwlist)
变量的命名规则
1、官方的命名规则 ⑴规定命名规则的目的是为了增加代码的识别性和可读性,并非绝对与强制 ⑵定义变量时,建议在=的左右两边各保留一个空格。 ⑶变量名由两个或多个单词组成时,每个单词都应使用小写字母,并且单词与单词之间用下划线连接。如:first_name 2、驼峰命名法 ⑴变量名由两个或多个单词组成时,还可以使用驼峰命名法来命名 ⑵小驼峰式命名法:第一个单词以小写字母开始,后续单词的首字母大写。如:firstName ⑶大驼峰式命名法:每一个单词的首字母都大写。如:FirstName。
不同类型变量之间的计算
1、数字型变量之间的计算 ⑴在Python中,数字型变量之间是可以直接计算的 ⑵布尔类型(bool)变量在计算时True的值为1,False的值为0 2、字符串变量之间的计算 ⑴在Python中,字符串变量之间可以用"+"进行拼接,生成新的字符串(字符串拼接) ⑵在Python中,字符串变量和整型变量之间可以用*进行计算,表示重复拼接相同的字符串。除此之外,数字型变量和字符串之间不能进行其他计算
例7:数字变量之间的加法
a = 1
b = 2
a = a + 1
b = a + b
print(a)
print(b)
"""
2
4
"""
例7_1:字符串变量之间的加、乘法
a = "hello"
b = " world"
b = a + b #两个字符串拼接
a = a * 2
print(a)
print(b)
"""
hellohello
hello world
"""
例7_2:
a = "1"
b = "2"
b = a + b #字符串型的数字进行拼接
print(b)
"""
12
"""
注: 1、字符串必须以引号标记开始,并以引号标记结束
2、只要使用双引号、单引号、三引号括起来的值,都属于字符串(当然三引号还用于多行注释,区别在于作为注释时,无赋值操作) 3、当数字为字符串时,在进行加法"+"计算时,表示的是字符串拼接,而不是数学上的加法
4、要告诉Python你在创建一个字符串,就要在字符两边加上引号,可以是单引号或双引号,Python表示在这一点上不挑剔。但必须成对,不能一边用单引号,另一边却用双引号
原始字符串
前面我们说到,在Python中创建一个字符串时,只需要在字符两边加上引号就可以了。那如果字符串内容中需要出现单引号或双引号,该怎么办?
例8:
print('Let's go')
#SyntaxError: invalid syntax
注: 1、如果在字符串中必须用到引号(如:'let's go'),如果直接这样写的话,python就会误会,报错:invalid syntax ⑴因为字符中存在多个相同的引号,Python无法区分哪个是字符串自带的,哪个是用来表示字符串的 ⑵认为'Let'是一个字符串,而sgo'是另一个不完整的字符串,因此就报错了 2、有两种方法来改进 ⑴使用转义符号"\":对字符串中的引号进行转义,这样Python就知道这个引号是要直接输出的 ⑵使用用单引号、双引号、三引号来区分
例8_1:
print('Let\'s go')
#Let's go
#使用反斜杠来进行转义
例8_2:
print("Let's go")
print("""Let's go""")
"""
因为字符串本身中用的是单引号,因此外部就可以使用双引号或者三引号来区分
Let's go
Let's go
"""
3、另外在变成语言中还有跟多的特殊的符号来表示特殊的一些操作。如:\n表示换行等例9:
print("C:\now")
"""
C:
ow
"""
注: 1、在这个例子中我们实际想打印的是文件的目录字符串,但是由于字符串中"\n"刚好构成换行符,因此造成了实际输出与我们预期的不一致 2、解决这类问题的办法有两个 ⑴使用双转义:"C:\\now" ⑵在使用原始字符串时,在字符串前面加字母"r":表明字符串为原始字符串(在后面的正则表达式中就会经常用到r来表示原始字符串) 例9_1:
print("C:\\now")
print(r"C:\now")
"""
C:\now
C:\now
"""
注: 1、在使用字符串时需要注意的一点是:无论是否为原始字符串,都不能以反斜杠作为结尾
2、反斜杠放在字符串的末尾表示该字符串还没有结束,换行继续的意思
长字符串
在打印一长串字符串时,我们有可能就会遇到使用很多换行符,这样就显得很是麻烦
例10:
print("从明天起做一个幸福的人\n喂马,砍柴,周游世界\n从明天起,关心粮食和蔬菜\n我有一所房子,面朝大海,春暖花开")
"""
从明天起做一个幸福的人
喂马,砍柴,周游世界
从明天起,关心粮食和蔬菜
我有一所房子,面朝大海,春暖花开
"""
注: 1、可以看到,如果字符串是一个长字符串,当要换行输出时,就需要使用很多换行符,这样就显得很麻烦了
2、如果需要写非常长的字符串,它需要跨多行,那么可以使用三个引号代替普通引号
3、python为我们提供了简单的方法:使用三重引号字符串"""内容"""
例9_1:
a = """从明天起做一个幸福的人
喂马,砍柴,周游世界
从明天起,关心粮食和蔬菜
我有一所房子,面朝大海,春暖花开
"""
print(a)
"""
从明天起做一个幸福的人
喂马,砍柴,周游世界
从明天起,关心粮食和蔬菜
我有一所房子,面朝大海,春暖花开
"""
注: 1、因为这种与众不同的引用方式,你可以在字符串之间同时使用单引号和双引号,而不需要使用反斜线进行转义
2、普通字符串也可以跨行。如果一行之中最后一个字符是反斜线,那么换行符本身"转义"了,也就是被忽略了
例9_2:
a = """从明天起做一个幸福的人
'喂马,砍柴,周游世界'
"从明天起,关心粮食和蔬菜"
我有一所房子,面朝大海,春暖花开
"""#在三引号中使用单引号和双引号:不需要转义
print(a)
b = "从明天起做一个" \
"幸福的人"
print(b)
"""
从明天起做一个幸福的人
'喂马,砍柴,周游世界'
"从明天起,关心粮食和蔬菜"
我有一所房子,面朝大海,春暖花开
从明天起做一个幸福的人
"""
注:编程中使用的标点符号都是英文的
拓展
1、python字符串分为两种类型,一种是bytes类型,一种是str类型 ⑴bytes存储的是byte类型,即二进制流类型 ⑵str类型(字符串)存储的是Unicode类型
2、类型转换 ⑴内置函数bytes():可以将字符串str类型转换成bytes类型。在使用内置函数bytes()的时候,必须明确encoding的参数,不可省略 ⑵内置函数str():可以将字符串bytes类型转换成str类型
3、字符串的元素是字符,bytes对象的元素则是字节
例10:
a = "hello,世界"
a = bytes(a , encoding='utf-8')
print(a)
#b'hello,\xe4\xb8\x96\xe7\x95\x8c'
注: 1、a是个字符串类型。Python有个内置函数bytes()可以将字符串str类型转换成bytes类型,
2、在进行类型转换后,a实际上是一串01的组合,但为了在ide环境中让我们相对直观的观察,其中的中文部分被表现成了b'\xe4\xb8\x96\xe7\x95\x8c'这种形式 3、开头的b表示这是一个bytes类型。\xe4是十六进制的表示方式,它占用1个字节的长度,因此”世界“被编码成utf-8后,我们可以数得出一共用了6个字节,每个汉字占用3个
例10_1:
a = b'hello,\xe4\xb8\x96\xe7\x95\x8c'
a = str(a, encoding='utf-8')
print(a)
#hello,世界
注: 1、Python已经严格区分了bytes和str两种数据类型,你不能在需要bytes类型参数的时候使用str参数,反之亦然。这点在读写磁盘文件时容易碰到
2、在bytes和str的互相转换过程中,实际就是编码解码的过程,必须显式地指定编码格式
3、另外在Python中转换字符串编码的函数还有encode()和encode(),这两种方法与这里的两个方法类似
例10_2:
a = b'hello,\xe4\xb8\x96\xe7\x95\x8c'
a = a.decode('UTF-8')
print(a)
# hello,世界
a = a.encode('GBK')
print(a)
# b'hello,\xca\xc0\xbd\xe7'