n201_python变量定义和流程控制
1.变量及其定义方法
-
python定义变量时,不需要显示地给出变量类型,python解释器会根据所赋值的类型自动确定变量的类型。
使用type(x)来查看变量的数据类型
-
python变量是引用类变量,变量中存储的并不是“所赋的值”,而是其引用(地址/指针)。
使用id(x)查看变量的引用或引用的映射值(如引用的hash值)
-
python是强类型语言,除了赋值运算符,python表达式不会自动进行类型转换。
例如,代码1+"123"在C、Java中不报错,但在python中会报错。
使用数据类型函数,可以对python对象进行类型强制转化,如int()、float()、double()、complex()、list()等
代码1+"123"可以改写为1+int("123")
-
如何查看自定义的变量?
利用dir()函数可以查看搜索路径下已经定义的变量。"搜索路径"是一个重要的概念,当python代码遇到用户自定义的变量时,python解释器回到"搜索路径"中查找这个变量,若找不到,则报错。
可以使用魔术命令%whos查看已经自定义的变量名称,变量类型及变量的具体值
x=1 y=2.2 z=list() %whos
Variable Type Data/Info x int 1 y float 2.2 z list n=0 -
删除已经定义的变量
使用del(x)或者del x删除已定义的变量,如果再使用,会报错 name 'x' is not defined
python采用的垃圾回收机制为:引用计数 + 标记清除 + 分代回收
1.1 变量的定义方法
与C、Java不同的是,python使用"赋值语句"的方式定义变量,即不需要显示声明变量的数据类型。
mystr和"mystr":前者是变量,需要定义声明后才能使用,后者是字符型常量,所以使用时不需要事先定义。
1.2 Python是动态类型语言
python中变量不需要事先声明其数据类型,同一变量可以被赋值为不同的对象类型。
x = 10
x = "test"
在python中,对变量每次赋值均可理解为新定义一个变量。
python作为动态类型语言,其含义与不可变对象是有区别的。
"动态类型语言":是指变量的类型可否动态变更(是一种全部替换),在python中定义变量后,还可以动态的定义为另一种变量。
"不可变对象":是指变量的内容是否可以被局部替换。在python中,变量内容课分为两种:可变对象和不可变对象。
譬如,字符串是不可变对象,因此不能对其进行局部修改。
1.3 Python中变量是引用类变量
python中,变量是一种容器,用于存放"目标数据(变量值)"的引用(reference)。变量名代表的是"值的一个引用",而非"变量的取值";C、Java和python中变量存在区别,前者变量中直接存放"值",后者则是存放"引用",即内存地址。
不同的python解释器(如CPython、JPython、ironPython)对引用的表示方法不同,在CPython中通常采用内存地址。
1.4 Python中区分大小写
编程语言中区分字母大小写的原因:采用的字符集对同一个字母的大小写的编码是不一样的。python3.0中采用的字符集是UTF-8。
1.5 变量命名规范
①变量名只能包含字母、数字、下划线 |
---|
②变量名以字母或者下划线开头 |
③不能用python的关键字作为变量名,如果使用的话,python不会报错,但是会引起混乱,当你重新定义了保留字之后,其原始含义会根据用户的定义发生改变,从而失去它预先设定好的功能,当想要调用它实现之前的功能时,原有的功能就已经失效了! |
命名方法的若干建议:
①模块名和包名应当小写字母,且以下划线分割单词 regex_syntax |
---|
②类名或异常名应采用每个单词首字母大写 BaseServer |
③全局或者类常量,应使用全部大写字母,并以下划线分割单词的形式 MAX_LOAD |
④其余对象的命名,包括方法名、函数名、普通变量名,采用全部小写字母,并以下划线分割单词的形式 my_thread |
⑤若以上对象为私有类型,则用双下划线开头命名的形式 new |
1.6 iPython的特殊变量
iPython提供了丰富的交互式计算架构,包括:功能强大的交互式外壳(shell);Jupyter内核;支持交互式数据可视化和GUI工具箱的使用;灵活、可嵌入的解释器;易于使用且高性能的并行计算工具。
In[]和Out[]并非python的变量,而是ipython为了方便编辑代码和跟踪执行过程而给出的特殊变量,返回的结果是Cell中填写的代码。
如果在In[]中输入短下划线 _ ,则返回值是最近的一个Out[]变量的值。
1.7 查看python关键字的办法
import keyword
print(keyword.kwlist) #调用print函数,使得列表中的值同行显示
# ['False', 'None', 'True', 'and', 'as', 'assert', 'async', 'await', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'nonlocal', 'not', 'or', 'pass', 'raise', 'return', 'try', 'while', 'with', 'yield']
2.运算符、表达式、语句
2.1 运算符
算数运算符 | + - * / % **(幂) //(整除) |
---|---|
关系运算符 | == != > < >= <= |
赋值运算符 | = += -= *= /= %= **= //= |
逻辑运算符 | and or not |
位运算符 | &(按位与) |(按位或) ^(按位异或) ~(按位取反) <<(左移) >>(右移) |
集合运算符 | in(属于) not in(不属于) == != <(真子集⊂) <=(子集⊆) >(⊃) >=(⊇) &(交集) |(并集) - 或 \ (差集) ^(对称差分) |
-
python中的特殊运算符
-
成员运算符:in,用于判断某个变量是否在容器中
集合运算符 in 与 < 的区别,前者是判断是否为一个成员(∈),后者是判断是否为一个子集(⊆ ⊂ ⊇ ⊃)。
-
身份运算符:is,用于判断两个对象是否为同一个对象
根据引用的位置是否相同进行判断,如果引用位置相同则返回True;is not则相反,引用位置不同则返回的是True
与运算符相关的函数,如内置函数和math包。
-
在python中逻辑运算符 and or not 不能与位运算符 & | ~ 混淆
and 和 or 为短路运算符
-
位运算符,bin(x),其输出结果中,前缀0b在python中表示二进制数。
按位异或时,正负号是怎么确定的???
-
-
使用运算符时的优先级与运算方向
2**2**3 #结果为256:从右往左计算先得到2**3=8,再计算2**8 (2**2)**3 #结果为64 1+2 and 3+4 #结果为7
2.2 语句书写规范
-
python中没有类似C、Java中的";"来作为专用的"结束符",因为python的解释器不是根据是否存在"语句结束符"来表示语句的存在或结束,而是根据其语法完整性。
-
python语句通常是一行一句,但也可以"一行多句"以及"一句多行",前者使用语句分隔符";",后者则使用续行符" \ "。
python中的分号代表的是语句分隔符,而C、Java中代表的是语句结束符。
python中使用分号代表一行多句,而使用逗号则表示的是元组。
在使用print()函数输出多个值时:
a=1 b=2 print(a,b)# 正确 print(a;b)# 会报语法错误 SyntaxError: invalid syntax,因为;在python表示的是语句分隔符
-
python中的缩进十分重要,使用缩进来表示复合语句或语句之间的嵌套关系,类似于C、Java中的 {};缩进必须以 ":" 开始,
同一个层级的代码的缩进方式应该保持一致。
-
如果python中没有语句结束符,则使用pass语句来表达"空语句"。
通常python是"可执行的伪代码",空语句需要pass来"占位",否则报错。
print("请输入x") x = int(input()) #input默认接收的是字符串数据类型,str,因此要进行数据类型的强转 if x>1: print("hello") else: pass
-
关于python代码的编写规范参见《PEP8-Style Guide for Python Code》和《Google Python Style Guide》
2.3 赋值语句
-
赋值语句除了赋值功能,同时变量的定义也是通过赋值语句实现的,不定义不能用。
-
赋值语句中,变量存储的值不是数值本身,而是数值的引用(指针,即内存地址的hash值),而不是其本身。
引用类型(reference)与数值类型(value)的区别:
引用类型指向对象的位置,因此任何通过该引用所做的更改都会影响同一个对象。数值类型则是会复制一份新的数据,所以对复制的数据做任何改动也不会影响原始数据。
传递数值类型会先对该数值进行拷贝,再将拷贝出来的数值传递给函数。因此任何对于该数值拷贝的改动都不会影响原始数值。
传递引用相当于传递一个对象的地址,这里不会发生对象拷贝,即使有多个变量储存同一个引用,这些引用指向的都是同一个对象,因此任何通过该引用向对象做出的改动都会影响同一个对象。
-
python中的链式赋值语句,是从右向左执行的
-
python赋值语句的特殊之处:
- 支持序列的拆包式赋值,如a,b,c=1,2,3
序列的拆包式赋值规则为"对号入座",拆包式赋值的输出结果是元组,即带有"()"
在拆包式赋值中常采用的两个特殊符号:_ 和 *_
前者代表的是一个临时变量,只能接收(跳过)一个值,后者代表的是可以跳过任意长度的值。
a,_,c=1,2,3 a,c # output (1,3) a,*_,c=1,2,322,5,666 a,c # output (1,666)
- 变量值的调换,在C、Java中需要引入第三个变量,才能完成两个变量值的互换c=a;a=b;b=c 但在python中可以使用a,b=b,a调换
a,b相当于元组(a,b),(b,a)是另一个元组,即a,b=b,a相当于(a,b)=(b,a),属于元组的拆包式赋值。
2.4 注释语句
单行注释 使用# (快捷键 CTRL+/);多行注释 前后使用三个单引号'''或者双引号"""将注释行括起来.
所有快捷键的使用均需要在英文状态下
2.5 流程控制语句
if语句
#if语句的两种表达方式
#1、多行写法——"语句式"写法
a=int(input())
b=int(input())
if(a<b):
print(a)
elif(a==b):
print(a)
else:
print(b)
#2、单行写法——"表达式"写法
x = int(input())
Result = "Y" if x>0 else "N"
Result
python的if语句单行表达式的写法类似于Java中的三元条件运算符 "?:"。本质是if多行写法中if后面的部分语句的提前。
if语句注意事项: |
---|
① 不是'{}',而是缩进和':' |
② 可含有elif语句 |
③ if elif else 后面的语句都不能为空,所以需要pass代表空语句 |
此外,在python中,if语句、for语句和函数均可以写成单行,分别称为三元运算符、列表推导式、lambda函数。
if语句 | 三元运算符 |
---|---|
for语句 | 列表推导式 |
函数 | lambda函数 |
软件开发项目(C、Java)和数据分析项目具有本质的区别。不能把python当作C、Java来用,不要试图用python去翻译C、Java的代码,因为两者应用的方向就不同,比如判断是否为闰年,python是这样做的(使用内置的标准库或第三方库):
import calendar
calendar.isleap(2022) #output:False
for语句
-
基本语法——如何写for语句
""" for 循环变量 in 容器: 循环体 """ sum=0 for i in (1,2,3): sum=sum+i print(i,sum) """ output:for语句的运行原理——按迭代的方式,从in后面的有序容器中读取循环变量的值 1 1 2 3 3 6 """
与C、Java不同的是,python的for语句写法只有一种形式:for ... in ...
in后面为可迭代对象或迭代器
-
for语句的主要应用场景——列表推导式
-
for i in [] 意为i在可迭代对象列表[ ]中,从第0个元素开始,逐个遍历。
-
for语句的in后面经常会出现range()函数,其中的range()是生成一个迭代器的函数,可以写成range(start,stop,step)或range(n),这里range(n)相当于range(0,n,1),相当于[0,1,2,...,n-1]即数学中的[0,n-1]或者[0,n)
range()函数的返回值是range迭代器,为了显示迭代器的内容,可以用list()函数将range()函数返回的迭代器转化为列表。
a= range(1,6) list(a) #output:[1, 2, 3, 4, 5]
-
注意事项:与C、java不同的是,python的for语句还可以带else部分。
同时像C、Java一样支持break和continue,前者是一遇全停,后者是一遇仅停止该次。
break是"跳出循环体",不再执行;continue是"跳在循环体内",继续执行。
while语句
-
基本语法
在python中while语句的语法单一,且没有do-while语句,但是可以使用while和break语句实现类似功能。
while(循环条件):
循环体
break语句是跳出循环体,continue是跳在循环体;与C、Java不同的是,python的while语句可以带有else部分。
但是else语句正常运行的前提是:while语句是正常结束的,不能是break导致结束的,否则else后面的语句都不会输出。
i=1 sum=0 while(i<11): sum+=i i+=1 if(i==1): continue if(i==9): continue print(i,sum) else: print("end is coming") """ OUTPUT: 2 1 3 3 4 6 5 10 6 15 7 21 8 28 ————如果将第二个continue换成break,则输出到这停止输出 10 45 11 55 end is coming """
pass语句
pass语句代表的是空语句,相当于C、Java中的空语句";"(只有一个分号的语句);因为python中没有语句结束符,因此必须用pass语句表示空语句,没有的话,会报错,因为python是"可执行的伪代码"。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本