1.变量及其定义方法

  1. python定义变量时,不需要显示地给出变量类型,python解释器会根据所赋值的类型自动确定变量的类型。
    使用type(x)来查看变量的数据类型
  2. python变量是引用类变量,变量中存储的并不是“所赋的值”,而是其引用(地址/指针)
    使用id(x)查看变量的引用或引用的映射值(如引用的hash值)
  3. python是强类型语言,除了赋值运算符,python表达式不会自动进行类型转换。
    例如,代码1+"123"在C、Java中不报错,但在python中会报错。
    使用数据类型函数,可以对python对象进行类型强制转化,如int()、float()、double()、complex()、list()等
    代码1+"123"可以改写为1+int("123")
  4. 如何查看自定义的变量?
    利用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

  1. 删除已经定义的变量
    使用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(不属于) == != <(真子集⊂) <=(子集⊆) >(⊃) >=(⊇) &(交集) |(并集) - 或 \ (差集) ^(对称差分)

  1. python中的特殊运算符
  • 成员运算符:in,用于判断某个变量是否在容器中
    集合运算符 in 与 < 的区别,前者是判断是否为一个成员(∈),后者是判断是否为一个子集(⊆ ⊂ ⊇ ⊃)。
  • 身份运算符:is,用于判断两个对象是否为同一个对象
    根据引用的位置是否相同进行判断,如果引用位置相同则返回True;is not则相反,引用位置不同则返回的是True
    与运算符相关的函数,如内置函数和math包。
  • 在python中逻辑运算符 and or not 不能与位运算符 & | ~ 混淆
    and 和 or 为短路运算符
  • 位运算符,bin(x),其输出结果中,前缀0b在python中表示二进制数。
    按位异或时,正负号是怎么确定的???
  1. 使用运算符时的优先级与运算方向
2**2**3 #结果为256:从右往左计算先得到2**3=8,再计算2**8
(2**2)**3 #结果为64
1+2 and 3+4 #结果为7

2.2 语句书写规范

  1. python中没有类似C、Java中的";"来作为专用的"结束符",因为python的解释器不是根据是否存在"语句结束符"来表示语句的存在或结束,而是根据其语法完整性。
  2. python语句通常是一行一句,但也可以"一行多句"以及"一句多行",前者使用语句分隔符";",后者则使用续行符" \ "。
    python中的分号代表的是语句分隔符,而C、Java中代表的是语句结束符。
    python中使用分号代表一行多句,而使用逗号则表示的是元组。
    在使用print()函数输出多个值时:
a=1
b=2
print(a,b)# 正确
print(a;b)# 会报语法错误 SyntaxError: invalid syntax,因为;在python表示的是语句分隔符
  1. python中的缩进十分重要,使用缩进来表示复合语句或语句之间的嵌套关系,类似于C、Java中的 {};缩进必须以 ":" 开始,
    同一个层级的代码的缩进方式应该保持一致。
  2. 如果python中没有语句结束符,则使用pass语句来表达"空语句"。
    通常python是"可执行的伪代码",空语句需要pass来"占位",否则报错。
print("请输入x")
x = int(input()) #input默认接收的是字符串数据类型,str,因此要进行数据类型的强转
if x>1:
    print("hello")
else:
    pass
  1. 关于python代码的编写规范参见《PEP8-Style Guide for Python Code》和《Google Python Style Guide

2.3 赋值语句

  1. 赋值语句除了赋值功能,同时变量的定义也是通过赋值语句实现的,不定义不能用。
  2. 赋值语句中,变量存储的值不是数值本身,而是数值的引用(指针,即内存地址的hash值),而不是其本身。
    引用类型(reference)与数值类型(value)的区别:
    引用类型指向对象的位置,因此任何通过该引用所做的更改都会影响同一个对象。数值类型则是会复制一份新的数据,所以对复制的数据做任何改动也不会影响原始数据。
    传递数值类型会先对该数值进行拷贝,再将拷贝出来的数值传递给函数。因此任何对于该数值拷贝的改动都不会影响原始数值。
    传递引用相当于传递一个对象的地址,这里不会发生对象拷贝,即使有多个变量储存同一个引用,这些引用指向的都是同一个对象,因此任何通过该引用向对象做出的改动都会影响同一个对象。
    值类型和引用类型的区分
  3. python中的链式赋值语句,是从右向左执行的
  4. python赋值语句的特殊之处:
  1. 支持序列的拆包式赋值,如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)
  1. 变量值的调换,在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语句

  1. 基本语法——如何写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后面为可迭代对象迭代器

  1. for语句的主要应用场景——列表推导式
  2. for i in [] 意为i在可迭代对象列表[ ]中,从第0个元素开始,逐个遍历。
  3. 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]
  1. 注意事项:与C、java不同的是,python的for语句还可以带else部分
    同时像C、Java一样支持break和continue,前者是一遇全停,后者是一遇仅停止该次。
    break是"跳出循环体",不再执行;continue是"跳在循环体内",继续执行。

while语句

  1. 基本语法
    在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是"可执行的伪代码"。