Python基础【第三篇】:变量与运算符

 


 

变量

 变量的声明

#!/usr/bin/env python
# -*- coding: utf-8 -*-

name = "tanghuan"

上述代码声明了一个变量,变量名为: name,变量name的值为:"tanghuan"

变量的作用:昵称,其代指内存里某个地址中保存的内容

 

变量定义的规则

    • 变量名只能是 字母、数字或下划线的任意组合
    • 变量名的第一个字符不能是数字
    • 以下关键字不能声明为变量名
      ['and', 'as', 'assert', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'exec', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'not', 'or', 'pass', 'print', 'raise', 'return', 'try', 'while', 'with', 'yield']

变量的赋值

每个变量在内存中创建,都包括变量的标识,名称和数据这些信息。

每个变量在使用前都必须赋值,变量赋值以后该变量才会被创建。

等号(=)用来给变量赋值。

等号(=)运算符左边是一个变量名,等号(=)运算符右边是存储在变量中的值。例如:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

name1 = "james"
name2 = "kobe"

#!/usr/bin/env python
# -*- coding: utf-8 -*-

name1 = "james"
name1 = name2

 

 Python 中的变量赋值不需要类型声明

#!/usr/bin/env python
# -*- coding: utf-8 -*-

name = "james"  #字符串类型
age = 32        #int类型
point = 27.9    #浮点型
print(name,age,point)
C:\Users\dell>python.exe D:/first.py
james 32 27.9

python允许多个变量同时赋值

#!/usr/bin/env python
# -*- coding: utf-8 -*-

a = b = c = 2
print(id(a),id(b),id(c))

其中id(变量名),表示查看变量的内存地址。

输出:

C:\Users\dell>python.exe D:/first.py
1826292208 1826292208 1826292208

以上实例,创建一个整型对象,值为2,三个变量被分配到相同的内存空间上。

你也可以多个变量指定多个值。

#!/usr/bin/env python
# -*- coding: utf-8 -*-

a,b,c = 1,1.2,"james"

上述实例,我们将整型对象分配给变量a,将浮点对象1.2分配给变量b,将字符串对象"james"分配给变量c。

 

附:

变量定义的规范

文件名
全小写,可使用下划线



应该是简短的、小写的名字。如果下划线可以改善可读性可以加入。如mypackage。

模块

与包的规范同。如mymodule。



总是使用首字母大写单词串。如MyClass。内部类可以使用额外的前导下划线。

 

函数&方法
函数名应该为小写,可以用下划线风格单词以增加可读性。如:myfunction,my_example_function。
*注意*:混合大小写仅被允许用于这种风格已经占据优势的时候,以便保持向后兼容。


函数和方法的参数
总使用“self”作为实例方法的第一个参数。总使用“cls”作为类方法的第一个参数。
如果一个函数的参数名称和保留的关键字冲突,通常使用一个后缀下划线好于使用缩写或奇怪的拼写。


全局变量
对于from M import *导入语句,如果想阻止导入模块内的全局变量可以使用旧有的规范,在全局变量上加一个前导的下划线。
*注意*:应避免使用全局变量


变量
变量名全部小写,由下划线连接各个单词。如color = WHITE,this_is_a_variable = 1
*注意*:
1.不论是类成员变量还是全局变量,均不使用 m 或 g 前缀。
2.私有类成员使用单一下划线前缀标识,多定义公开成员,少定义私有成员。
3.变量名不应带有类型信息,因为Python是动态类型语言。如 iValue、names_list、dict_obj 等都是不好的命名。


常量
常量名所有字母大写,由下划线连接各个单词如MAX_OVERFLOW,TOTAL。


异常
以“Error”作为后缀。


缩写
命名应当尽量使用全拼写的单词,缩写的情况有如下两种:
1.常用的缩写,如XML、ID等,在命名时也应只大写首字母,如XmlParser。
2.命名中含有长单词,对某个单词进行缩写。这时应使用约定成俗的缩写方式。
例如:
function 缩写为 fn
text 缩写为 txt
object 缩写为 obj
count 缩写为 cnt
number 缩写为 num,等。
前导后缀下划线
一个前导下划线:表示非公有。
一个后缀下划线:避免关键字冲突。
两个前导下划线:当命名一个类属性引起名称冲突时使用。
两个前导和后缀下划线:“魔”(有特殊用图)对象或者属性,例如__init__或者__file__。绝对不要创造这样的名字,而只是使用它们。
*注意*:关于下划线的使用存在一些争议。


特定命名方式
主要是指 __xxx__ 形式的系统保留字命名法。项目中也可以使用这种命名,它的意义在于这种形式的变量是只读的,这种形式的类成员函数尽量不要重载。如
class Base(object):
def __init__(self, id, parent = None):
self.__id__ = id
self.__parent__ = parent
def __message__(self, msgid):
# …略
其中 __id__、__parent__ 和 __message__ 都采用了系统保留字命名法。

 运算符

 什么是运算符?

举个简单的例子:1 + 2  ,1和5叫做操作数,而“+”就是运算符

Python支持下列运算符:

  • 算术运算符
  • 比较(关系)运算符
  • 赋值运算符
  • 逻辑运算符
  • 位运算符
  • 成员运算符
  • 身份运算符 

接下来一一进行讲解

算数运算符

取变量a = 5,b = 2

注意:在python2.X中,a/b返回的是整数,必须要将一个数改为浮点数。

#!/usr/bin/env python
# -*- coding: utf-8 -*-

a = 5.0       #改为浮点数
b = 2
print(a/b)

比较运算符

取变量a = 5,b = 10

赋值运算符

 

 位运算符使用不多,不作讲解。

逻辑运算符

python的逻辑运算符与其他语言不太一样,java语言的逻辑运算符只返回True或者False,

且运算符||(或),&&(且),~(非)的两边必须是true或者false。

但是python的逻辑运算符两边可以是其他类型的变量,且返回值不只有true或者false。

 

取变量 a = 5 ,b = 10 。

 1 a = 5
 2 b = 10
 3 print(a>b and a)   #a>b的值为false,所以返回false
 4 print(a>b and a<b) #a>b的值为false,所以返回false
 5 print(a and a<b)   #a的值不是false,返回a<b的值为true
 6 print(a<b and b)     #a<b的值不是false,返回b的值10
 7 
 8 print(a<b or a<b)  #a<b为true视为1非零,所以返回a>b的值true。
 9 print(a or a<b )   #a的值为5非零,所以返回a的值5
10 print(a>b or b)    #因为a>b为false视为0,则返回b的计算值10
11 print(a>b or b>5)  #因为a>b为false视为0,所以返回b>5的计算值true
View Code

 

 成员运算符

除了一些逻辑,算术运算符之外,python还包括一些实例对象的成员运算符,包括字符串,元祖。

 

 1 a = 5
 2 b = 10
 3 Arr = [1, 2, 3, 4, 5]
 4 name = "kobe_bryant"
 5 name1 = "kobe"
 6 name2 = "ebok"
 7 if a in Arr:
 8     print("a是list的成员")
 9 else:
10     print("a不是list的成员")
11 if b in Arr:
12     print("b是list的成员")
13 else:
14     print("b不是list的成员")
15 if name1 in name:
16     print("name1是name的成员")
17 else:
18     print("name1不是name的成员")
19 if name2 in name:
20     print("name2是name的成员")
21 else:
22     print("name2不是name的成员")  
View Code

 

以上实例输出结果:

1 C:\Python3.5.2\python.exe C:/Users/dell/PycharmProjects/Python_1/day10/firstPy.py
2 a是list的成员
3 b不是list的成员
4 name1是name的成员
5 name2不是name的成员

身份运算符

身份运算符用于查看两个对象是否属于同一个存储单元,就是比较两个对象的地址是否一样。

 1  1 list = [1,2,3,4]
 2  2 arr = list
 3  3 if list is arr:
 4  4     print("list和arr指向同一个内存单元")
 5  5     print("list的地址为:",id(list))
 6  6     print("arr的地址为:",id(arr))
 7  7 else:
 8  8     print("list 和 arr指向的不是同一个内存单元")
 9  9 arr1 = list[:]
10 10 if arr1 is list:
11 11     print("list和arr1指向同一个内存单元")
12 12 else:
13 13     print("list和arr1不是指向同一个内存单元")
14 14     print("list的地址是:",id(list))
15 15     print("arr1的地址是:",id(arr1))
View Code

 

此实例输出的结果为:

1 C:\Python3.5.2\python.exe C:/Users/dell/PycharmProjects/Python_1/day10/firstPy.py
2 list和arr指向同一个内存单元
3 list的地址为: 2313605031112
4 arr的地址为: 2313605031112
5 list和arr1不是指向同一个内存单元
6 list的地址是: 2313605031112
7 arr1的地址是: 2313605004040

对于上述实例,我们可以引申出运算符”==“和”is“的区别,在上述代码加入如下代码:

if arr1 == list:
    print("list和arr1中的内容是一样的")
else:
    print("list和arr1中的内容是不一样的")

输出:

list和arr1中的内容是一样的

运算符“==”和“is”的区别

举一个例子:我家买了一辆奔驰,你家买了一辆奔驰,我家的奔驰和你家的一样吗?用“==”来判断的话两辆奔驰就是一样的,因为两辆奔驰没有任何不同,同一个地方买

的,相同的型号。但是用“is”来判断的话,两辆奔驰就不一样了,因为他们处在不一样的地方,地址不同。

记住这一点:两个变量对应的内存地址是一样的,那么他们的值在内存中只有一个;如果两个变量对应的内存地址不一样,但是两个变量对应的值完全一样,那么,这

个值是在地址里面存了两份的。

 1 >>> a = "tanghuan"
 2 >>> b = "tanghuan"
 3 >>> id(a)
 4 2423859864688
 5 >>> id(b)
 6 2423859864688
 7 >>> c = 2.5
 8 >>> d = 2.5
 9 >>> id(c)
10 2423858045216
11 >>> id(d)
12 2423858045168
13 >>>

 

python中值相同的话,内存地址不一定一样

 python中会为每个出现的对象分配内存,哪怕他们的值完全相等(注意是相等不是相同)。如执行a=1.4,b=1.4这两个语句时会先后为1.4这个Float类型对象分配内存,然后将a与b分别指向这两个对象。所以a与b指向的不是同一对像:

1 >>> a=1.4
2 >>> b=1.4
3 >>> id(a)
4 2423858045216
5 >>> id(b)
6 2423858045288

 

 但是为了提高内存利用效率对于一些简单的对象,如一些数值较小的int对象,python采取重用对象内存的办法,如指向a=2,b=2时,由于2作为简单的int类型且数值小,python不会两次为其分配内存,而是只分配一次,然后将a与b同时指向已分配的对象,字符串类型也是如此:

 1 >>> a=2
 2 >>> b=2
 3 >>> id(a)
 4 1826292208
 5 >>> id(b)
 6 1826292208
 7 >>> c="tanghuan"
 8 >>> d="tanghuan"
 9 >>> id(c)
10 2423859865392
11 >>> id(d)
12 2423859865392
13 >>>
View Code

如但果赋值的不是2而是较大的数值,情况就跟前面的不一样了:

1 >>> a = 256
2 >>> b = 256
3 >>> a is b
4 True
5 >>> a = 257
6 >>> b = 257
7 >>> a is b
8 False

每个电脑的内存分配不同,所以到底是哪个值使得内存要分配两次,不得而知,本人觉得这也是python的缺陷。

python没有自增(++)、自减(--)符号

因为在 Python 里的数值和字符串之类的都是不可变对象,对不可变对象操作的结果都会生成一个新的对象。

 

python不同于其他编程语言,比如C/Java。

在Java或者C中创造一个整形对象 int a=1,如果进行运算a = a + 1,那么a的内存地址不会变的,只不过内存中的数值由1变成了2。但是在python中就不一样了,他有另一套机制。

比如a = 1,a += 1,那么解释器会创造一个内存来存放2,然后变量a再指向2,而不是原来的地址。

 1 >>> id(1)
 2 1826292176
 3 >>> a = 1
 4 >>> id(a)    #a的地址和1一样
 5 1826292176
 6 >>> id(2)
 7 1826292208
 8 >>> a += 1     #a的地址和2一样,a改变了地址
 9 >>> id(a)
10 1826292208
11 >>>

 

 

 

 

posted @ 2018-08-10 17:09  焕熊  阅读(377)  评论(0编辑  收藏  举报