《零基础上手Python爬虫系列》 - 04 变量与运算符

2020-02-13  本文已影响0人  聂云⻜

本篇主要讲述变量、常量和运算符的基本使用,持续更新。

变量

1. 变量的定义

变量的概念基本上和初中代数的方程变量是一致的,只是在计算机程序中,变量不仅可以是数字,还可以是任意数据类型。

变量在程序中就是用一个变量名表示了,变量名必须是大小写英文、数字和_的组合,且不能用数字开头,比如:

a_1 = 'string'

# 不能以数字开头
1_a = 'string'
  File "<input>", line 1
SyntaxError: invalid decimal literal

# 不能跟系统关键词重复
import = 1
  File "<input>", line 1
    import = 1
           ^
SyntaxError: invalid syntax

这种变量本身类型不固定的语言称之为动态语言,与之对应的是静态语言。静态语言在定义变量时必须指定变量类型,如果赋值的时候类型不匹配,就会报错。

起名字最好有意义,可以用简洁的英文单词标识,多个单词用下划线分隔。

2. 常量

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

PI = 3.14159265359

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

2. 值类型

理解变量在计算机内存中的表示也非常重要。当我们写:

a = 1

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

也可以把一个变量a赋值给另一个变量b,这个操作实际上是把变量b指向变量a所指向的数据

>>> a = 1

>>> id(a)
4458617488

>>> b = a
>>> id(b)
4458617488

>>> a = 2
>>> id(a)
4458617520

>>> a,b
(2, 1)

3. 引用类型

>>> a = [1,2]
>>> b = a
>>> a[0] = '1'
>>> b
['1', 2]

>>> id(a)
4480304448
>>> id(b)
4480304448

int、str、tuple(不可改变的)是值类型

# 重新赋值后地址发生变化
>>> a = 1
>>> id(a)
4458617488

>>> a = 2
>>> id(a)
4458617520

# 字符串操作后地址也发生了变化
>>> a = 'hello'
>>> id(a)
4506199792

>>> a += 'python'
>>> id(a)
4513079344

list set dict(可变的)是引用类型

# 列表重新对整个列表赋值,会变化
>>> a = [1]
>>> id(a)
4480316928

>>> a = [2]
>>> id(a)
4480319168

# 但是操作元素不会发生变化
>>> a = [1,2]
>>> id(a)
4510858624

>>> a[0] = 3
>>> id(a)
4510858624

不可改变的类型,一旦赋值就不再变化,重新赋值给原来的变量名称,其实已经是一个新的变量了。 id() 标识一个地址,所对应的的地址变化,就是标识b已经不是原来的b了

>>> hex(id(a))
'0x10bb51a90'

运算符

1. 算数运算符

>>> [1,2,3] * 3
[1, 2, 3, 1, 2, 3, 1, 2, 3]

# 除法,结果为浮点数, 所以整数的除法也是精确的
>>> 1/1
1.0

# 整除
>>> 1//2
0

# 求余
>>> 5%2
1

# 幂运算
>>> 2**3
8

2. 比较运算符

# 单个字符用ASCII码比较,多个字符串依次比较字符ASCII码  
>>> 'a' > 'b'
False
>>> ord('a')
97
>>> ord('b')
98

# 不止数字可以比较,比较的过程中是依次比较各个元素
>>> [1,2] < [2,3]
True
>>> [1,2] < [2,3,1]
True

3. 赋值运算符

>>> a = 1
>>> a += 2
>>> a
3

4. 逻辑运算符

False

>>> not False
True
>>> not not False
False

逻辑运算返回结果也会有转换关系,or

# 结果跟顺序没有关系
>>> [1] or []
[1]
>>> [] or [1]
[1]

# 判断结果后不再继续往后处理
>>> 'a' or 'b'
'a'
>>> 'b' or 'a'
'b'

not 返回的是布尔型, or 和 and 会将结果转换

>>> 'a' and 'b'
'b'
>>> 'b' and 'a'
'a'

5. 成员运算符 in 和not in

>>> 'a' in 'abc'
True
>>> 'a' in ('a',)
True
>>> 'a' in ['a']
True
>>> a in {a}
True

# 字典的成员关系是针对key
>>> 'a' in {'a':'b'}
True
>>> 'b' in {'a':'b'}
False

6. 身份运算符 is

== 判断值是否相等,is比较两个变量的身份是否相同(类似PHP中的===)

>>> a = 1
>>> b = 1.0
>>> a == b
True
>>> a is b
False

# 即便对于无序的集合,依然要完全一致
>>> a = {1,2,3}
>>> b = {2,1,3}

>>> a
{1, 2, 3}
>>> b
{1, 2, 3}
>>> a == b
True
>>> a is b
False

判断类型

>>> a = '123'
>>> type(a) == str
True

# 优先使用
>>> isinstance(a, int)
False

# 可以指定多个
>>> isinstance(a, (int,str))
True

7. 位运算符

>>> a = 1
>>> b = 2
>>> bin(a)
'0b1'
>>> bin(b)
'0b10'
>>> a & b
0

>>> a = 2
>>> b = 3
>>> bin(a)
'0b10'
>>> bin(b)
'0b11'
>>> a & b
2

8 ,运算符的优先级

运算符 描述
** 指数 (最高优先级)
~ + - 按位翻转, 一元加号和减号 (最后两个的方法名为 +@ 和 -@)
* / % // 乘,除,取模和取整除
+ - 加法减法
>> << 右移,左移运算符
& 位 'AND'
^ 位运算符
<= < > >= 比较运算符
<> == != 等于运算符
= %= /= //= -= += *= **= 赋值运算符
is is not 身份运算符
in not in 成员运算符
not and or 逻辑运算符

表达式的运算的优先级

运算符的优先级

特例:

and 的优先级 > or

可以添加括号来指定优先级,括号的优先级最高,加括号有利于代码的阅读

上一篇下一篇

猜你喜欢

热点阅读