Python【第二篇】运算符及优先级、数据类型及常用操作、深浅拷贝

时间:2020-12-04 15:48:09

一、运算符及优先级

Python 运算符(算术运算、比较运算、赋值运算、逻辑运算、成员运算)

1.算术运算符

运算符

描述

实例,a=20,b=10

+

a+b输出结果30

-

a-b输出结果10

*

a*b 输出结果200

/

a/b输出结果2

%

取模

a/b输出结果0

**

取幂

a**b输出结果20的10次方

//

取整除

9/2输出结果4,9.0/2.0输出结果4.0

2.比较运算符

运算符

描述

实例

==

等于

(a==b)返回False

!=

不等于

(a!=b)返回True

<>

不等于

(a<>b)返回True #3.x测试错误

>

大于

(a>b)返回True

>=

大于等于

(a>=b)返回True

<

小于

(a<b)返回False

<=

小于等于

(a<=b)返回False

3.赋值运算符

运算符

描述

实例

=

简单的赋值运算符

c=a+b,将a+b的运算结果赋值给c(30)

+=

加法赋值运算符

c+=a 等效于c=c+a

-=

减法赋值运算符

c-=a 等效于c=c-a

*=

乘法赋值运算符

c*=a 等效于c=c*a

/=

除法赋值运算符

c/=a 等效于c=c/a

%=

取模赋值运算符

c%=a 等效于c=c%a

**=

取幂赋值运算符

c**=a 等效于c=c**a

//=

取整除赋值运算符

c//=a 等效于c=c//a

4.逻辑运算符

运算符

描述

实例

and

布尔“与”

(a and b)返回True

or

布尔“或”

(a or b)返回True

not

布尔“非”

not(a and b)返回False

5.成员运算符

运算符

描述

实例

in

如果再指定的序列中找到值,返回True,否则返回False

x在y序列中,如果x在y序列中返回True

not in

如果再指定的序列中找不到值,返回True,否则返回False

x在y序列中,如果x在y序列中返回False

a="abcdefg"
b="b"
if b in a :
print("b元素在a字符串中")
else:
print("b元素不在a字符串")

6.位运算符

运算符

描述

实例 a=00001010 b=00010100

&

按位与运算符

(a&b)输出结果0

|

按位或运算符

(a|b)输出结果30

^

按位异或运算符

(a^b)输出结果30

~

按位取反运算符

~10输出结果-11

<<

左移运算符

a<<2输出结果40

>>

右移运算符

a>>2输出结果2

7.身份运算符

运算符

描述

实例

is

is是判断两个标识符是不是引用自一个对象

x is y,如果id(x)等于id(y),is返回结果1

is not

is not是判断两个标识符是不是引用不同对象

x is not y,如果id(x)不等于id(y),is not返回1

8.三目运算符

三目运算符可以简化条件语句的缩写,可以使代码看起来更加简洁,三目可以简单的理解为有三个变量,它的形式是这样的 name= k1 if 条件 else k2 ,如果条件成立,则 name=k1,否则name=k2,下面从代码里面来加深一下理解,从下面的代码明显可以看出三目运算符可以使代码更加简洁。

a=1
b=2
if a<b: #一般条件语句的写法
k=a
else:
k=b k=a if a<b else b    #三目运算符的写法 

9.运算符优先级

Python【第二篇】运算符及优先级、数据类型及常用操作、深浅拷贝

二、数据类型及常用操作(数字, bool, str, list, tuple, dict, set)

数据类型:数字、字符串、布尔值、字符串、列表、元组、字典、集合

序列:字符串、列表、元组

散列:集合、字典

Python【第二篇】运算符及优先级、数据类型及常用操作、深浅拷贝

查看不同数据类型的方法,dir(),列如:dir(list)

>>> dir(list) ['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__delslice__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getslice__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__setslice__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']

1、数字

int

Python可以处理任意大小的正负整数,但是实际中跟我们计算机的内存有关,

在32位机器上,整数的位数为32位,取值范围为-2**31~2**31-1,即-2147483648~2147483647

在64位系统上,整数的位数为64位,取值范围为-2**63~2**63-1,即-9223372036854775808~9223372036854775807。

long

跟C语言不同,Python的长整数没有指定位宽,即:Python没有限制长整数数值的大小,但实际上由于机器内存有限,我们使用的长整数数值不可能无限大。
注意,自从Python2.2起,如果整数发生溢出,Python会自动将整数数据转换为长整数,所以如今在长整数数据后面不加字母L也不会导致严重后果了。

注意:在Python3里不再有long类型了,全都是int。

py2中

Python【第二篇】运算符及优先级、数据类型及常用操作、深浅拷贝

py3中

Python【第二篇】运算符及优先级、数据类型及常用操作、深浅拷贝

float

浮点数也就是小数,之所以称为浮点数,是因为按照科学记数法表示时,一个浮点数的小数点位置是可变的,比如,1.23x109和12.3x108是相等的。浮点数可以用数学写法,如1.23,3.14,-9.01,等等。但是对于很大或很小的浮点数,就必须用科学计数法表示,把10用e替代,1.23x109就是1.23e9,或者12.3e8,0.000012可以写成1.2e-5,等等。

2、布尔值(bool)

布尔类型很简单,就两个值 ,一个True(真),一个False(假),,主要用记逻辑判断
也可以将bool值归类为数字,是因为我们也习惯用1表示True,0表示False

class bool([x])

Return a Boolean value, i.e. one of True or Falsex is converted using the standard truth testing procedure. If x is false or omitted, this returns False; otherwise it returns True. The bool class is a subclass of int (see Numeric Types — int, float, complex). It cannot be subclassed further. Its only instances are False and True (see Boolean Values).

# 参数如果缺省,则返回False
print(bool()) # False # 传入布尔类型时,按原值返回
print(bool(True)) # True
print(bool(False)) # False # 传入字符串时,空字符串返回False,否则返回True
print(bool('')) # False
print(bool('0')) # True # 传入数值时,0值返回False,否则返回True
print(bool(0)) # False
print(bool(0,)) # False
print(bool(1)) # True # 传入元组、列表、字典等对象时,元素个数为空返回False,否则返回True
print(bool(())) # False
print(bool((0,))) # True
print(bool([])) # False
print(bool([0])) # True
print(bool({})) # False
print(bool({'name':'jack'})) # True

3、字符串(str)

字符串特性:有序、不可变

在Python中,加了引号的字符都被认为是字符串!
那单引号、双引号、多引号有什么区别呢? 单双引号木有任何区别,只有下面这种情况 你需要考虑单双的配合

msg = "My name is jack, I'm 22 years old!"

多引号什么作用呢?作用就是多行字符串必须用多引号

msg = '''
我在学python,
python功能很强大,
你是否要一起学习呢?
'''
print(msg)

常用操作

s="abcdef ghg k"
print(s.title()) #将字符串转换成标题,输出 Abcdef Ghg K print(s.capitalize()) #将字符串首字母大写,输出 Abcdef ghg k print(s.count('d',0,len(s))) #计算出子串 'd'在母串中出现的次数,默认是在整个母串中查找,
                  #可以在后面跟两个参数指定起始位置查找,这里我指定了在(0,len(s))中查找,
                  #其中len(s)代表获取字符串长度 print(s.startswith('a')) #判断字符串是否以什么开头,这里输出True, print(s.find('g',0,len(s))) #查找子串第一次在母串中出现的位置,这里输出7,同样可以自己指定位置范围来搜查 print(s.upper()) #将字符串转换成大写,这里输出ABCDEF GHG K print(s.join(['a','b','c'])) #用字符串 s 来连接列表['a','b','c'] 输出 aabcdef ghg kbabcdef ghg kc print(s.strip())         #移除两侧空格 print(s.split())         #分割字符串,返回一个列表 这里输出['abcdef', 'ghg', 'k'] print(s.replace('g','G',1)) #替换,默认全部替换,可以设置为1,只替换一次,这里只替换一次输出abcdef Ghg k print(s[0:4]) #切片,[0:4]代表将字符串s的前面4位取出来,这里输出 abcd

4、空值(None)

空值是Python里一个特殊的值,用None表示。None不能理解为0,因为0是有意义的,而None是一个特殊的空值。

5、列表(list)

列表是Python内置的一种数据类型,是一种有序的集合,可以放任何数据类型,可对集合进行方便的增删改查操作。

查看列表的方法,help(list)

Python【第二篇】运算符及优先级、数据类型及常用操作、深浅拷贝

更简便看列表的方法:dir(列表)

Python【第二篇】运算符及优先级、数据类型及常用操作、深浅拷贝

l=['a','b','cc',4]     #定义一个列表

l.append(5)         #添加一个元素,l=['a', 'b', 'cc', 4, 5]

l.pop()           #从尾部删除一个元素,l=['a', 'b', 'cc', 4]

l.remove('a')         #从列表中移除 'a',l=['b', 'cc', 4]

l.extend(['gg','kk'])    #添加一个列表['gg','kk'], l=['b', 'cc', 4, 'gg', 'kk']

l.reverse()          #反转一个列表,l=['kk', 'gg', 4, 'cc', 'b']

print(l.count('kk'))     #某元素出现的次数,输出 1

print(l.index('gg'))     #元素出现的位置,输出 1

for i in l:          #循环输出列表元素
print(i) print(l[0:4:2])       #列表切片,以步长2递增,输出['kk', 4]

6、元组(tuple)

不可修改,是只读列表

元组中不仅可以存放数字、字符串,还可以存放更加复杂的数据类型
元组本身不可变,如果元组中还包含其他可变元素,这些可变元素可以改变

uple和list非常类似,但是tuple一旦初始化就不能修改,tuple也是有序的,tuple使用的是小括号标识。

t=('a','b','b','c')   #定义一个元组

print(t.index('b'))   #索引出元素第一次出现的位置,还可以指定在某一范围里查找,这里默认在整个元组里查找输出1

print(t.count('b'))   #计算元素出现的次数,这里输出2

print(len(t))      #输出远组的长度,这里输出4

for i in t:
print(i)       #循环打印出元组数据 print(t[1:3])       #切片 输出('b','b')

7、字典(dict)

字典是无序的,使用键-值(key-value)存储,具有极快的查找速度。

d = {'Michael': 95, 'Bob': 75, 'Tracy': 85}

d.get('Bob')                     #根据key获取values,如果不存在返回None,这里输出75

d.pop('Bob')                     #根据键删除某一元素 d={'Michael': 95, 'Tracy': 85}

d['Jason']=99                       #新增元素 d={'Michael': 95, 'Tracy': 85, 'Jason': 99}

print(len(d))                       #输出字典长度,这里输出3

print('Jason' in d)                 #python3 中移除了 has_key,要判断键是否存在用in

for i in d:
print(i)                     #循环默认按键输出 for i in d.values():                #循环按值输出
print(i) for k,v in d.items():                #循环按键值输出
print(k,v)

8、集合(set)

set是一个无序(不支持索引和切片)而且不重复的集合,有些类似于数学中的集合,也可以求交集,求并集等,下面从代码里来看一下set的用法,如果对这些用法不太熟悉的话,可以照着下面的代码敲一遍。

s1={1,2,3,1}                #定义一个set s1 如果s1={}为空则默认定义一个字典
s2=set([2,5,6]) #定义一个set s2
print(s1) #s1={1,2,3} 自动去除重复的元素 s1.add(5) #s1={1,2,3,5} 添加一个元素
print(s1) s3=s1.difference(s2) #返回一个s1中存在而不存在于s2的字典s3,s3={1,3},而s1并没有改变
print(s3) s1.difference_update(s2) #s1跟新成上面的s3 s1={1,3}
s1.discard(1) #删除元素1,不存在的话不报错 s1={3}
print(s1)
s1.remove(3) #删除元素3,不存在的话报错 s1={}
print(s1)
s1.update([11,2,3]) #跟新s1中的元素,其实是添加 s1={11,2,3}
print(s1)
k=s1.pop() #删除一个元素,并将删除的元素返回给一个变量,无序的,所以并不知道删除谁                   
s1={1,2,3,4}          #这里重新定义了集合s1,s2
s2={3,4,5,6}
r1=s1.intersection(s2) #取交集,并将结果返回给一个新的集合 r1={3,4}
print(r1)
print(s1)
s1.intersection_update(s2) #取交集,并将s1更新为取交集后的结果 s1={3,4}
print(s1) k1=s1.issubset(s2) #s1是否是s2的的子序列是的话返回True,否则False 这里k1=true
print(k1)
k2=s1.issuperset(s2) #s1是否是s2的父序列 k2=False k3=s2.isdisjoint(s1) #s1,s2,是否有交集,有的话返回False,没有的话返回True
print(k3)
s1.update([1,2]) #s1={1,2,3,4}
r3=s1.union(s2) #取并集将结果返回给r3 r3={1,2,3,4,5,6}
print(r3)
r2=s1.symmetric_difference(s2) #r2=s1并s2-s1交s2 r2={1,2,5,6}
print(r2)
s1.symmetric_difference_update(s2) #s1更新为 s1并s2 - s1交s2 s1={1,2,5,6}
print(s1)

三、深浅拷贝

浅拷贝会创建一个新的对象,只拷贝了原列表中嵌套列表的内存地址(里面的嵌套列表与原列表指向同一个内存地址),嵌套列表中的内容改变了,所以就跟随改变了;
对于不可变数据类型,深浅拷贝都只拷贝了引用,对于可变数据类型,深浅拷贝都会创建一个新的对象。

对于 数字 和 字符串 而言,赋值、浅拷贝和深拷贝无意义,因为其永远指向同一个内存地址。

对于字典、元祖、列表 而言,进行赋值、浅拷贝和深拷贝时,其内存地址的变化是不同的。

赋值,只是创建一个变量,该变量指向原来内存地址

浅拷贝,在内存中只额外创建第一层数据

深拷贝,在内存中将所有的数据重新创建一份(排除最后一层,即:python内部对字符串和数字的优化)

在python中,对象赋值实际上是对象的引用。当创建一个对象,然后把它赋给另一个变量的时候,python并没有拷贝这个对象,而只是拷贝了这个对象的引用。

lia = [1,2,3,["a","b"]]

一般有三种方法:

(1)直接赋值,传递对象的引用而已,原始列表改变,被赋值的lib也会做相同的改变

lia = [1,2,3,["a","b"]]
lib = lia
print(id(lia), lia)
print(id(lib), lib)
lia.append(4)
print(id(lia), lia)
print(id(lib), lib)
lib.append(5)
print(id(lia), lia)
print(id(lib), lib)
lia[3].append('c')
print(id(lia), lia)
print(id(lib), lib)

Python【第二篇】运算符及优先级、数据类型及常用操作、深浅拷贝

(2)copy浅拷贝,没有拷贝子对象,所以原始数据改变,子对象会改变

Python【第二篇】运算符及优先级、数据类型及常用操作、深浅拷贝

import copy
lia = [1,2,3,["a","b"]]
lib = copy.copy(lia)
print(id(lia), lia)
print(id(lib), lib)
lia.append(4)
print(id(lia), lia)
print(id(lib), lib)
lib.append(5)
print(id(lia), lia)
print(id(lib), lib)
lia[3].append('c')
print(id(lia), lia)
print(id(lib), lib)

Python【第二篇】运算符及优先级、数据类型及常用操作、深浅拷贝

(3)深拷贝,包含对象里面的子对象的拷贝,所以原始对象的改变不会造成深拷贝里任何子元素的改变

Python【第二篇】运算符及优先级、数据类型及常用操作、深浅拷贝

import copy
lia = [1,2,3,["a","b"]]
lib = copy.deepcopy(lia)
print(id(lia), lia)
print(id(lib), lib)
lia.append(4)
print(id(lia), lia)
print(id(lib), lib)
lib.append(5)
print(id(lia), lia)
print(id(lib), lib)
lia[3].append('c')
print(id(lia), lia)
print(id(lib), lib)

Python【第二篇】运算符及优先级、数据类型及常用操作、深浅拷贝

四、练习题(参考答案已放在Q群文件中)

1.一个列表,找出只出现一次的元素。

2.列表 [11,22,33,44,55,66,77,88,99],将所有大于 66 的值保存至字典的第一个key中,将小于 66 的值保存至第二个key的值中。即: {'k1': 大于66的所有值, 'k2': 小于66的所有值}

3.两个列表,其中一个列表比另外一个列表多一个元素,写一个函数,返回这个元素

4.三级菜单

  可依次选择进入各子菜单

  可从任意一层往回退到上一层

  可从任意一层退出程序