目录
一、变量
◆01 变量
>>2 变量名和关键字
>>3 动态类型语言
>>总结
二、数据类型
>>主要内在数据类型:
>>1 数值类型
>>2 列表
>>3 元组
>>4 字符串
>>.转义字符
>>5 集合
>>6 字典
>>总结
三、 类型转换和输入
>>1 隐式类型转换
>>2 显式类型转换
>>3 输入 -- 内置函数input()
四、运算符和表达式
1.应用方法
2.运算符的分类
算术运算符
2.比较运算符
3.逻辑运算符
4.位运算符
相关:计算机中正数和负数的存储形式:
5.赋值运算符
6.成员运算符: in、not in
7.身份运算符:is、is not
3 运算符的优先级
>>运算符的优先级
>>总结
五、可变对象和不可变对象
1.假如我们对 不可变类型 tuple 元组进行修改会怎样?
2.下列代码呢?
3.如果1个变量指向的是1个可修改的对象,那么可以通过这个变量修改它指向的对象,而这个时候并不会创建新对象
>>总结
六、控制语句
1.if条件语句
if....else
if...elif...else
2.循环语句
1.while循环语句
2.for循环语句
什么是可迭代对象?
函数range():range(strat,stop[,step])
3.break语句
4.continue语句
5.else语句
6. pass语句
总结
>>变量是对象的引用:
print(va) # va未被定义
将产生NameError(名字错误)的语法错误:>>Python中有两个运算符==和is。
前者用于比较对象的值是否相等,后者用于判断两个对象是否为同一个。
>>True和False是Python的bool(布尔)类型的两个值
>>函数type():返回类型
a = 100
b = 100
print(type(a))
print(type(b))
print(a == b, type(a == b))
print(a is b, type(a is b))
>>可以用函数id()得到a、b的内存地址。例如:
print(id(a),' ',id(b))
上文,a,b都指向同一地址(100),地址相同
变量名应该尽量直观易懂。
例如,应使用“PI”而不应用“sdfduzwlf2”来表示圆周率。
变量名只能包含字母、数字和下画线,且不能以数字开头。同时,变量名不能和已经被Python语言使用的名字(关键字)相同。
>>在静态类型语言,如C语言中,定义变量时必须指明其数据类型
>>Python是一个动态类型语言,变量名仅是一个对象的名字,并不是占据一块内存的那个对象本身,一个变量名可以随时指向不同的对象,直到程序运行时,才能根据其指向的对象知道该对象的数据类型。
>>可分为int(整型)、float(浮点型)、complex(复数类型)、bool(布尔类型)。
>>只要计算机内存足够,Python的整型的长度就可以任意长。但浮点型的值小数点后的精度不超过15位,而复数型的值总是写成x+yi形式。
>>list是一个数据元素的有序序列,定义列表时用一对左右方括号[ ]包围,元素之间用逗号隔开。list中的元素可以是不同的类型。
>>因为list是一个有序序列,因此,对于list对象可以用下标运算符[ ]访问它的一个元素或一系列连续的元素。
>>还可以通过向下标运算符[ ]传递起始位置和结束位置的两个下标,返回连续多个元素组成的子列表(不包含结束位置的元素)
>>list对象是可修改的(mutable)。
>>为指定下标范围内的元素赋值一个空的list[ ],相当于删除这个范围内的元素
>>必须给下标范围内的元素赋值一个list对象,如果赋值非list对象则会出错。例如:
li = [2,3.14,8,'python',6,'hello',2]
# li[2:5] = [10,22] # 不包括 5
# 上面输出为:[2, 3.14, 10, 22, 'hello', 2]
li[2:5] = 5
print(li)
产生TypeError(类型错误)
>>和list一样,元组(tuple)也是一个有序序列
>>但tuple是不可修改的
>>创建tuple时用圆括号()
>>可以用下标运算符[ ]访问tuple的元素,但不可以通过下标修改tuple对象,否则产生下列类型错误(TypeError)
>>只有一个元素的tuple的最后必须加一个逗号,如(25,)表示一个tuple,而(25)表示一个整数。
>>字符串是UniCode字符的有序序列,可以用置于首尾的单引号或双引号包围一个字符序列来表示字符串
>>单引号表示的字符串中可以包含双引号字符,但不能直接包含单引号。双引号表示的字符串中可以包含单引号,但不能直接包含双引号
>>str类型的对象是不可修改的(immutable),否则产生“字符串对象不支持赋值”的TypeError(类型错误):
>>用\'表示单引号字符,这种前面加反斜杠字符表示字符'的\'称为“转义字符”
>>转义字符\\表示的是单个斜杠字符\
>>转义字符通常可以表示各种不可见的字符,如控制字符
>>\t表示“制表符”,\n表示“换行符”
>>函数print()在遇到这些字符时会执行特定的动作。例如,对于制表符\t,就输出固定个数的空格,对于换行符\n就换到新的一行。
>>set是不包含重复元素的无序集合
>>用左右花括号{ },包围的,以逗号隔开的一组元素
>>因为集合无序,所以不能用下标操作其中的元素
>>set中不能有相同值的元素。
demo = {1,2,3,4,5,6,7,1,2,3,4,5,6}
print(demo)
可以看到,重复的元素并没有输出
>>集合是根据其元素的哈希值存储元素的,所以无法计算哈希值的对象不能作为集合的元素。
list对象是无法计算哈希值的,所以不能作为集合的元素,否则产生“list不是可哈希的类型”的TypeError(语法错误):
“unhashable” 不可哈希的类型:’list‘
>>dict是一个“键-值”对 的无序集合。
>>dict中的每个元素都以“键:值(key:value)”的形式存储
>>需要通过key(键,也称关键字)才能访问dict中key对应的值(value)。
错误类型:KeyError
dic = {'A':65,'B':66,'C':67}
print(dic['A']) # 65
# 下面两个键值不存在,报错 ‘KeyError'
# print(dic[0])
print(dic['D'])
• Python的内在数据类型包括int、float、complex、bool,str,list、tuple、set、dict等。
• list对象是可以修改的,而str和tuple等对象是不可修改的。
• 对于有序序列数据类型,如str、list、tuple,可以通过下标访问其中的一个或多个元素,而无序的set则不能用下标访问其中的元素
>>Python会自动将一个类型转为另外一个类型。
例如,在进行整数和浮点数运算时,Python会自动将整数转为浮点数。同时,两个整数相除时也会自动转为浮点数的相除。
>>但是,如果一个数(整数、浮点数等)和一个字符串想加,就不会进行“隐式类型转换”。
a=100
b = 1.3
print(a+b,type(a+b))
s = '6asdad'
print(a+s)
将产生“不支持int和str的加法运算”的TypeError(类型错误):
>>内置函数str()将数值类型(int、float、complex)的值转为字符串str类型
>>内置函数float()既可将一个合适格式的字符串类型的值转为float类型的值,也可将一个int类型的值转为float类型的值。
>>内置函数int()既可将一个合适格式的字符串类型的值转为int类型的值,也可以将一个float类型的值转为int类型的值(此时,该值小数点后的部分会被截断)
>>但是,内置函数int()不能将一个不合适格式的字符串转为int类型的值。
s1='65'
s = '1.0000'
print(int(s1))
print(int(s))
>>产生“无效的int文字量”的ValueError(值错误)
>>可以通过内置函数input()从键盘输入数据,
>>函数input()输入的永远是一个字符串
• 隐式类型转换:表达式中混合int、float类型的值时,Python会自动将int类型的值转为float类型的值。
• 显式类型转换:可以用内置函数str()将其他类型的值转为字符串str类型,也可以用内置函数int()或float()将其他类型的值转为int或float类型。
• 内置函数input()从键盘输入的永远是一个字符串str类型的值,需要用内置函数int()或float()转为数值类型才能参与算术计算。
不同的运算符具有不同的优先级和结合性
注意:不同类型的对象支持的运算符有所不同;注意是否合法
+ 对int 来说是加法 对字符串来说是拼接
a = 1
b = 2
print(type(a+b),a+b) # int
a = '1'
b = '2'
print(type(a+b),a+b) # 字符串类型
print(type(a*6),a*6) # a重复6遍
与或非 优先级:not>and>or
二元位运算符:位与,位或,异或
一元位运算符:取反,左移,右移
数字在计算机中是以补码保存的,所以Python位运算是作用在补码上
b = 3 # 0011
print(b<<2) # 12
(1)计算机中的正数用原码表示;
(2)计算机中的负数用补码(原码取反再加一)表示。
左移右移:位运算符之左移和右移 - 知乎
计算机中数的存储形式:计算机中数的存储形式(原码,反码,补码的表示)_不吃猫的鱼c的博客-CSDN博客_数字在计算机中的存储形式
x=2
x+=3 # x=x+3
变量x现在引用的是一个新的结果对象而不是原来的2,可以通过输出x的id来验证这一点
>>用于判断一个值(对象)是否在一个容器对象,如 list、str、tuple 对象中,返回布尔类型。
>>用于判断2个变量(标识符)是不是引用的同一个对象。例如:
a = 10
b = 10
print(id(a),' ' ,id(b))
print(a is b)
print(a is not b)
上述代码a,b都为10,要是改成1000呢?
可以看到,a和b 并不是引用的同一个对象了。
why?
因为在执行时会将小整数驻留在内存中,将小整数赋值给多个变量,它们实际引用的是同一个对象。而将整数赋值给不同变量,这些变量将引用临时创建的不同对象。
算术运算符总是“先乘除,后加减”,同样级别的运算符,如+和-则按照“自左往后的次序”计算
下表从上到下优先级降低:
无需特地去记忆,因为可以通过加括号来使运算按自己想要的顺序来
• 表达式是用运算符对运算数进行运算的式子,运算数包括值或变量,变量实际就是值对象的引用。
• 常见的运算符按照其功能,主要包括算术运算符、逻辑运算符、比较运算符、位运算符。
还有一些其他的运算符,如比较运算符(in和not in)、身份运算符(is和is not)。
• 不同的运算符具有不同的优先级,优先级高的先运算。无须记忆运算符的优先级,因为可以用圆括号保证正确的运算顺序。
list类型、set类型、dict类型等都是可变类型
数值类型、str类型、tuple类型都是不可变类型
可见:产生了类型错误“TypeError:'tuple'object does not support item assignment”
t = (1,2,3)
print(t)
t = (4,5,6)
print(t)
输出:
(1, 2, 3)
(4, 5, 6)
变量仅是对象的别名,而不是对象本身。当变量t引用不可修改的tuple对象(1,2,3)时,这个tuple对象不可修改,但可以对变量名t重新赋值,如“t=(4,5,6)”使变量t又引用了这个新的tuple对象。
假设有一个元组 (1,2,[520, 'ss'] ) 元组里有一个元素是列表类型
a = (1,2,[520, 'ss'] )
# a[1] = 20 报错
print("未修改前{}".format(a))
a[2][1] = 'sz'
print("修改后{}".format(a))
print(a[2])
输出:
• 数据类型分为可变类型和不可变类型,可变类型的对象的值是可修改的,而不可变类型的对象的值是不可修改的。
• 无论变量指向的是一个可修改的对象,还是一个不可修改的对象,给这个变量赋值都会使这个变量引用其他的对象(如创建的新对象)。对变量指向的可变对象的值进行修改不会使变量引用新对象,只是修改变量引用的对象的值。
注意缩进:if语句体的多条语句必须具有一致的缩进
否则报错:产生“缩进错误(IndentationError)
if...else..还有一种用法:A if B else C
如果B成立就执行A,否则就执行C
Python还有一个用于遍历访问一个容器(如str、list或tuple等容器)对象的每个元素的for...in循环
li = [1,2,3,2.14,'wos',True]
for each in li:
print(each)
输出:
它可以通过for循环迭代地访问其中的元素的一种对象,如list、tuple、set、dict和字符串str类型的对象都是可迭代对象
该函数返回一个可迭代对象,该对象包含了介于start和stop之间(但不包含stop)的一系列整数的可迭代对象
可以将函数range()产生的可迭代对象传递给内置函数list()或tuple()等构造一个list对象或tuple()对象。
在重复执行循环体时,如果满足某种条件,就可以用break语句跳出循环,即不再执行循环体。
在执行循环体时,如果遇到continue语句,则会停止执行其后续语句,返回循环开头继续执行循环体
循环语句(for或while)都可以在后面跟一个else语句,当for语句遍历完整个可迭代对象(如遍历完整个list的元素),或者当while语句的条件表达式是false退出时,都会执行这个else语句。但是,如果是通过break跳出循环语句则不会执行这个else语句。
pass是一个空语句,当需要有的地方需要一条语句,但是又不希望这条语句执行任何动作,这时就可以用pass语句,程序不会产生语法错误。或者,编写程序时还未想好写什么代码,可以用一个pass语句作为“占位符”
• if条件语句:if、if...else、if...elif...else等多个用法。
• while循环语句是当条件表达式为True时,会一直执行循环体中的程序块。
•循环for语句是迭代访问一个可迭代对象的所有元素。
• break语句用于跳出循环。continue语句用于终止循环体中后续的语句执行,重新开始下一轮循环。除非用break语句跳出循环,否则循环结束总会执行else语句。
• 空语句pass用于语法上需要语句而实际不需要做任何工作的地方,或者用作占位符,以等待后续补充代码。