0%

python基础学习二

变量与运算符

1,基本的运算

假如有列表A[1,2,3,4,5,6]和列表B[1,2,3]两个列表,对这两个列表做以下运算:A乘以3,再加上B,最后再加上列表A。我们容易可以写出如下代码:

1
2
>>> [1,2,3,4,5,6]*3 + [1,2,3] + [1,2,3,4,5,6]
[1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6, 1, 2, 3, 1, 2, 3, 4, 5, 6]

这样运算就很麻烦,我们引入了变量,比如可以用一个变量表示[1,2,3,4,5,6]这个列表。
变量的定义:A = [1,2,3,4,5,6]。B = [1,2,3]。那么我们上面的运算就可以写成 A*3 + B + A,这样就方便多了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
>>> A = [1,2,3,4,5,6] //变量A代表列表[1,2,3,4,5,6]

>>> print(A)

[1, 2, 3, 4, 5, 6]

>>> B = [1,2,3] //定义变量B

>>> print(B) //打印变量B

[1, 2, 3]

//做运算
>>> A*3 + B + A

[1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6, 1, 2, 3, 1, 2, 3, 4, 5, 6]

其中 “B = [1,2,3]”中的 “=”是赋值运算符。不过给变量起名字尽量要具有可读性,尽量表达出它的意义,这里举例子中的A和B显然就不合适,这不是合适的命名方式。我们要尽量提高代码的可阅读性,这是写出优质的代码的一个很重要的前提。尽量用英语给变量命名(千万不要用拼音)。

2,变量与运算的基本规范

  • 1,可以用数字、字母、下划线来定义变量,首字母不能是数字。
  • 2,系统已经使用了的关键字(也叫保留关键字,比如and、if、import,因为他们都是保留关键字),不能被用于变量中。
  • 3,type可以作为变量名(不建议这样使用,会产生歧义)
  • 4,变量名是区分大小写,
  • 5,变量没有类型限制(这也是python被称为动态语言的最大的缘由)
  • 6,
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
      >>> a = 1

    >>> b = a

    >>> a = 3

    >>> print(b)

    1
    b的值为1,不是3,没有改变。int、str、tuple都是不可变的;set、list、dict是可变的。
    >>> a = [1,2,3,4,5]

    >>> b = a

    >>> a[0] = '1'

    >>> print(a)

    ['1', 2, 3, 4, 5]
    >>> print(b)

    ['1', 2, 3, 4, 5]
    在这里列表第一个元素改变了,为什么?int类型和list是截然不同的额,int称为值类型,list是引用类型,它们的区别:类似于java中的基本数据类型和引用类型,

    >>> a = "hello"

    >>> a = a + "world"

    >>> print(a)

    helloworld
    字符串不是不可变的么?这里a怎么貌似从"hello"变成了"helloworld"。实际上不是,a = a + "world"生成了一个新的字符串,我们再看python的一个函数
    id(),用于显示某一个变量在内存的地址。
    >>> b = "hello"

    >>> id(b)

    1979272160456
    >>> b = b + "python"

    >>> id(b)

    1979272322480
    可以看到两次调用id方法b的地址是不同的,这就说明生成了一个行的字符串。再看:
    >> 'python'[0]

    'p'
    >>> 'python'[0]='o'

    Traceback (most recent call last):
    File "<pyshell#40>", line 1, in <module>
    'python'[0]='o'
    TypeError: 'str' object does not support item assignment
    这里就报错了,错误信息显示str是不可变的。

    >>> type = 1

    >>> type(1)

    Traceback (most recent call last):
    File "<pyshell#29>", line 1, in <module>
    type(1)
    TypeError: 'int' object is not callable
    报错,因为type已经是一个变量了,不能使用type(1)作为函数调用,所以尽量不要用type来命名变量,同样print也不要用来当变量名。

3,python运算符

3.1 比较运算符

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
>>> 1>1
False
>>> 'a'>'b'
False
>>> ord('a')
97
>>> ord('b')
98 //ACSII码
>>> 'abc'<'abd' // 比较ASCII值,而且是逐个比较,相同就往后继续比,c(99)的ASCII值比d(100)小。
True
//列表比较,也是逐个比较
>>> [1,2,3]<[1,2,3]
False
>>> [1,2,3]<[1,2,4]
True
//元组比较
>>> (1,2,3)<(1,2,3)
False
>>> (1,2,3)<(1,2,4)
True

3.2 逻辑运算符

逻辑运算符有and、or、not,它对布尔值进行运算,他们相关运算的规则与示例如下代码所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
//and 与运算
>>> True and True
True
>>> True and False
False

//or 或运算
>>> True or False
True
>>> False or False
False

//not 非
>>> not False
True
>>> not True
False
>>> not not True
True

//思考代码:
>>> 1 and 1
1
>>> 'a' and 'a'
'a'
>>> 'a' or 'b'
'a'
>>> not'a'
False
以上代码实际上也是成立的,逻辑运算符两边也是布尔型的值,1是True,与布尔型有一个转换,not 'a' == not True。
对于int、float类型的数,0被认为是False,非零表示True。
对于字符串:空字符串 False,非空字符串:True,所以以上的代码就可以理解了。

>>> not '0' //是字符串,而且非空,所以为True,不是0。
False

//列表:空的列表 False,非空列表 True,tuple、list、dict和列表类似。
>>> not[]
True
>>> not[1]
False
//返回结果是[1],实际上它是布尔型,非空的列表,就是True,[1]与布尔型的值有转换。
>>> [1]or[]
[1]
>>> []or[1]
[1]
//字符串
>>> 'a'and'b'
'b'
>>> ''and'b'
''
//
>>> not 0
True
>>> 1 and 0
0
>>> 0 and 1
0
>>> 1 and 2
2
>>> 2 and 1
1
>>> 0 and 1
0
>>> 1 and 2
2
//只要一个数值就可以表示结果,选择最后一个,
>>> 1 or 0
1
>>> 1 or 2 //读到第一个值的时候就已经可以得出结果了,所以就返回了。
1

3.3 成员运算符

成员运算符有两个,in、not in,就是在或不在。表示一个元素是否在一组元素里。
相关运算:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
//in
>>> a=1
>>> a in [1,2,3,4,5]
True
>>> b = 6
>>> b in [1,2,3,4,5]
False
//not in
>>> b not in [1,2,3,4,5]
True
>>> a not in [1,2,3,4,5]
False

>>> b = 'h'
>>> b in 'hhee'
True
>>> b not in (1,2,3,4,5)
True
>>> b not in{1,2,3,4,5,}
True

//字典的成员运算符
>>> b = 'a'
>>> b in {'c':1}
False

>>> b = 1
>>> b in {'c':1}
False

>>> b = 'c'
>>> b in {'c':1}
True
字典的成员运算是针对key,字典的key。

3.4 身份运算符

身份运算符有:is、is not。用于对象的判断,返回值是布尔值。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
>>> a = 'hello'
>>> b = 'hello'
>>> a is b
True
>>> a = 1
>>> b = 2
>>> a is b
False

>>> a = 1
>>> b = 1
>>> a is b
True
>>> a == b
True
>>> a = 1
>>> b = 1.0
>>> a==b
True
>>> a=1
>>> b = 1.0
>>> a is b
False
//关系运算符(==)比较的是值是否相等,is不是比较值,比较的是两个变量身份是否相等(内存地址是否相等)。
>>> a = 1
>>> b = 1.0
>>> id (a)
1799908384
>>> id(b)
2825402717672
>>> a == b
True
>>> a is b
False
//地址值不同,所以is返回False,== 返回True。
//集合的运算
>>> a = {1,2,3}
>>> b = {2,1,3}
>>> a == b
True
>>> a is b
False

//元组的运算
>>> c = (1,2,3)
>>> d = (2,1,3)
>>> c == d
False
>>> c is d
False
>>> id(a)
2026157550504
>>> id(b)
2026157966056
//分析:集合和元组不同,集合是无序的,{1,2,3}和{2,1,3}, == 是比较值,所以相等;is比较内存地址,所以返回False。而元组是有序的,做值的比较返回时False。

对象的三个特征:1,值;2,身份;3,类型。python中,一切皆对象(is,==,isinstance)。

1
2
3
4
5
6
7
8
9
10
11
12
13
>>> a = 'hello'
>>> type(a) == int //不建议使用
False
>>> type(a) == str
True
>>> isinstance(a,str)
True
>>> isinstance(a,int) //建议使用,isinstance可以判断值类型是属于哪一种,而type不可以。
False
>>> isinstance(a,(int,str,float)) //是否是三种中任意一种
True
>>> isinstance(a,(int,float))
False

3.5 位运算符

位运算符有这几种:&:按位与;|:按位或;^:按位异或;~:按位取反;<<:左移;>>:右移。

位运算符我们平时开发中使用的较少,可以稍作了解。位运算符都是对二进制数运算(把数字当做二进制进行运算)。

1
2
3
4
5
6
>>> a = 2
>>> b =3
>>> a & b
2
>>> a | b
3