Python【第二篇】运算符及优先级、数据类型及常用操作、深浅拷贝
一、运算符及优先级
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.运算符优先级
二、数据类型及常用操作(数字, bool, str, list, tuple, dict, set)
数据类型:数字、字符串、布尔值、字符串、列表、元组、字典、集合
序列:字符串、列表、元组
散列:集合、字典
查看不同数据类型的方法,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中
py3中
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
bool
([x])Return a Boolean value, i.e. one of True
or False
. x 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)
更简便看列表的方法:dir(列表)
- 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)
(2)copy浅拷贝,没有拷贝子对象,所以原始数据改变,子对象会改变
- 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)
(3)深拷贝,包含对象里面的子对象的拷贝,所以原始对象的改变不会造成深拷贝里任何子元素的改变
- 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)
四、练习题(参考答案已放在Q群文件中)
1.一个列表,找出只出现一次的元素。
2.列表 [11,22,33,44,55,66,77,88,99],将所有大于 66 的值保存至字典的第一个key中,将小于 66 的值保存至第二个key的值中。即: {'k1': 大于66的所有值, 'k2': 小于66的所有值}
3.两个列表,其中一个列表比另外一个列表多一个元素,写一个函数,返回这个元素
4.三级菜单
可依次选择进入各子菜单
可从任意一层往回退到上一层
可从任意一层退出程序
Python【第二篇】运算符及优先级、数据类型及常用操作、深浅拷贝的更多相关文章
- [Python笔记]第二篇:运算符、基本数据类型
本篇主要内容有:运算符 基本数据类型等 一.运算符 1.算术运算 2.比较运算 3.赋值运算 4.逻辑运算 5.成员运算 6.身份运算 7.位运算 8.运算符优先级 二.基本数据类型 1.整数:int ...
- python基础之数据类型操作补充,集合及其操作,深浅拷贝
内容概要: 数据类型操作补充 集合及其操作 深浅拷贝1.基础数据类型补充 1.1字符串的操作补充li = ["李嘉诚", "麻花藤", "黄海峰&qu ...
- Python 入门之代码块、小数据池 与 深浅拷贝
Python 入门之代码块.小数据池 与 深浅拷贝 1.代码块 (1)一个py文件,一个函数,一个模块,终端中的每一行都是代码块 (代码块是防止我们频繁的开空间降低效率设计的,当我们定一个变量需要开辟 ...
- Python开发【第二篇】:基本数据类型
运算符 1.算数运算 2.比较运算 3.赋值运算 4.逻辑运算 5.成员运算 基本数据类型 所有对象所具备的方法都保存在类中.对象和类的关系,举个例子:哺乳动物是类:此类下有两个对象,一个为狗.一个为 ...
- Python基础篇(二)_基本数据类型
Python基础篇——基本数据类型 数字类型:整数类型.浮点数类型.复数类型 整数类型:4种进制表示形式:十进制.二进制.八进制.十六进制,默认采用十进制,其他进制需要增加引导符号 进制种类 引导符号 ...
- Python 第二篇:python字符串、列表和字典的基本操作方法
本文基于python 3.5.1 python常见的数据类型有字串.列表.元组.字典等,本文将详细介绍每一种数据类型的操作方法. 一:str字串的操作方法: 1.capitalize()--> ...
- Python基础篇(四)_组合数据类型的基本概念
Python基础篇——组合数据类型的基本概念 集合类型:元素的集合,元素之间无序 序列类型:是一个元素向量,元素之间存在先后关系,通过序号进行访问,没有排他性,具体包括字符串类型.元组类型.列表类型 ...
- 进击python第二篇:初识
入门拾遗 模块 模块用以导入python增强其功能扩展 1.使用 import [模块名] 导入,应用方式:模块. 函数,例: >>> import math >>> ...
- python的列表数据类型及常用操作
列表是最常用的Python数据类型,它可以作为一个方括号内的逗号分隔值出现. 列表中的每个元素都分配一个数字 - 它的位置,或索引,第一个索引是0,第二个索引是1,依此类推. 列表可以进行的操作包括索 ...
随机推荐
- 小程序实践(十):textarea实现简单的编辑文本界面
textarea是官方的原生组件,用于多行输入 简单的例子,监听文本内容.长度,以及设置最大可输入文本长度 wxml <view class='textarea-Style'> <t ...
- ARM汇编指令集_学习笔记(1)
一.什么是ARM汇编? 运行在ARM处理器上的汇编语言就叫ARM汇编. C程序运行在X86平台,底层就是X86汇编:运行在ARM平台,底层就是ARM汇编.ARM汇编与X86汇编有显著区别. X86属于 ...
- 微信小程序 从含有tabbar的页面跳转到不含有tabbar的页面
如何离开含有tabbar的页面 在微信小程序开发过程中,我们会碰到从某页跳转到一个含有tabbar的页面的需求, 用 wx.navigateTo({url: '...',}) 不起作用,需要使用 w ...
- CentOS7 设置yum源
1.关闭防火墙 临时关闭防火墙 systemctl stop firewalld 永久防火墙开机自关闭 systemctl disable firewalld 临时打开防火墙 systemctl st ...
- WinServer-FTP搭建
FTP服务器(File Transfer Protocol Server)是在互联网上提供文件存储和访问服务的计算机,它们依照FTP协议提供服务. FTP是File Transfer Protocol ...
- c/c++ 多线程 unique_lock的使用
多线程 unique_lock的使用 unique_lock的特点: 1,灵活.可以在创建unique_lock的实例时,不锁,然后手动调用lock_a.lock()函数,或者std::lock(lo ...
- FPGA配置OV5640摄像头及RGB图像数据采集
本文设计思想采用明德扬至简设计法.在做摄像头数据采集处理之前,需要配置OV5640传感器内部寄存器使其按要求正常工作,详细内容请参见<OV5640自动对焦照相模组应用指南>.首先要关注OV ...
- Python爬虫之Selenium库的基本使用
Selenium 是一个用于Web应用程序测试的工具.Selenium测试直接运行在浏览器中,就像真正的用户在操作一样.支持的浏览器包括IE(7, 8, 9, 10, 11),Mozilla Fire ...
- Python爬虫之Beautiful Soup库的基本使用
- Java之IO流进阶篇:内存流,打印流,对象流
Java中的IO流,即为输入输出流.所谓输入输出流,都是相对于程序而言,程序就是这个参照物.一张图看懂输入输出流: 输入流抽象基类:InputStream,Reader 输出流抽象基类:OutputS ...