命令行与shell
- 在windows上cmd和powershell都是命令行执行窗口,但powershell功能更加强大。
- Powershell 从 Windows7 时代开始内置于 Windows 系统当中,可以看作是微软对 cmd 的大升级,目前两者bai并存于 Windows 系统中。
- powershell 背后依靠的是一套完整的 .NET 编程体系,其脚本更容易编写且稳健性大大提升。
- 因为 powershell 可以看作 cmd 的超集,所有的常用命令诸如dir, cd, ipconfig等在 powershell 中都能直接使用。但背后的实现方式是完全不同的,powershell 基于完全的面向对象,它通过给函数和对象“起别名”的方式来支持这些旧的命令;
- powershell支持复杂的管道操作:管道操作的灵感来自 Linux 的 shell,但由于 powershell 将一切都包装成为对象,而不是直接处理字符串,因此其管道操作的灵活程度远在 Linux 的 shell 之上。
变量
每个变量在使用前必须用“=”赋值,变量赋值以后该变量才会被创建。
变量名 = 值
在Python中,定义变量是不需要指定数据类型的。Python 可以根据 = 等号右侧的值,自动推导出变量中存储数据的类型。
在 Python 中,变量就是变量,它没有类型,我们所说的"类型"是变量所指的内存中对象的类型。
变量存储数据的类型(使用type获取)。
变量的地址(使用id获取)
firstNumber = 23 # 驼峰式命名
second_number = 45 # 下划线命名
print (firstNumber,second_number)
a = b = 5 # Python允许同时为多个变量赋值
c,d,e = 3, 5.0 ,'sun' # Python允许同时为多个对象指定多个变量,且可以指定不同的数据类型
print(a,b,c,d,e) #5 5 3 5.0 sun
type(a) #int
b='LV'
print(id(a)) #94829453530016
print(id(b)) #140167978840752
f=b #f只是和b指向同一个地址的标签
print(id(b)) #140167978840752
print(id(f)) #140167978840752
- python的回收机制:当一些静态的数据,没有标签贴向它的时候,会被自动回收。
运算符
算术运算符( + - * / % ** //)
print(5+6) #11
print(5-6) #-1
print(5*6) #30
print(16/6) # 结果为浮点型,2.66666666666
print(16//6) # 结果为整形(整数截断),2
print(16%6) # 结果取余数,4
print(5**3) # N幂次,125
0.1+0.2 # 除不尽,0.30000000000004
#round(0.1+0.2,2)
- round
round(0.1+0.2,2) #2位数后截断,0.3
# round的结果跟python版本有关
round(-0.6) #-1
比较运算符(< <= > >= == !=)
结果:true,false
赋值运算符(= += -= *= /= %= **= //= )
a = 21
a += 1 # a=a+1 (没有a++),22
print(a)
a -= 1 #21
print(a)
a *= 4 #84
print(a)
a /= 2 #42.0
print(a)
a %= 4 #取余数,2.0
print(a)
a **= 3 #N次幂,8.0
print(a)
a //= 5 #向下取整的除法,1.0
print(a)
逻辑运算符( and or not )
c = 60
d = 50
c and d #50
True and False #False
位运算符( & | ^ ~ << >> )
c = 60 # 0011 1100
d = 50 # 0011 0010
c & d #48
成员运算符(in, not in)
str1 = 'dianzi'
if ('i' in str1):
print('Y')
else:
print('N') #Y
身份运算符( is, is not)
身份运算符用于比较两个对象的存储单元
a = 4
b = 4
b is a #True
运算符优先级
(3*6)+(4/8)-(4*6) # ()权限最高,-5.5
Python数据类型
数字Number
- Number 数据类型用于存储数值,包括整型(int)、布尔型(bool)、浮点型(float)、复数(complex)。
- 布尔型: Python2 中是没有布尔型的,它用数字 0 表示 False,用 1 表示 True。到 Python3 中,把 True 和 False 定义成关键字了,但它们的值还是 1 和 0,它们可以和数字相加。
- 在混合计算时,Python会把整型转换成为浮点数。
a,b,c,d = 20, 5.5, True, 4+7j
type(a),type(b),type(c),type(d) #(int, float, bool, complex)
#isinstance(a,int)
a=2
type(a)
isinstance(a,int) #True,a是整型
isinstance(c,(str,dict,list,tuple)) #c是否是元组(str,dict,list,tuple)的一个
type和isinstance的区别:isinstance(object,classinfo)用来判断一个函数是否是一个已知类型,type用来查看某数据类型
字符串String
字符串是 Python 中最常用的数据类型。可以使用引号( ’ 或 " )来创建字符串。
原始字符串
print('Let\'s go') #字符串中有单引号或双引号,Let's go
#print('Let's go') 错误
s='D:\now'
print(s) #D:
#ow
t='D:\\now'
print(t) #D:\now
Python 使用反斜杠 \ 转义特殊字符,如果不想让反斜杠发生转义,可以在字符串前面添加一个 r,表示原始字符串。
lujing='C:\Program Files\ntel\tiFi\Help\nhup\thank'
print(lujing) #C:\Program Files
#tel iFi\Help
#hup hank
lujing2='C:\Program Files\\ntel\\tiFi\Help\\nhup\\thank'
print(lujing2) #C:\Program Files\ntel\tiFi\Help\nhup\thank
lujing3=r'C:\Program Files\ntel\tiFi\Help\nhup\thank' #加r,输出原始字符串
print(lujing3) #C:\Program Files\ntel\tiFi\Help\nhup\thank
字符串索引与切片
- 切片语法:字符串[start : end : step],默认截取方向从左往右。
- start默认值0,end默认值字符串末元素,step默认值为1。若为负值,截取方向从右往左。
str1 = 'engineer'
str1[7:0:-1] #左闭右开,'reenign'
左闭右开
str1 = 'engineer'
str1[3] #'i'
str1[-5] #'i'
str1[1:5] # 左闭右开,'ngin'
str1[3:-4] # 左闭右开,'i'
str1[:8] # 左闭右开,留空即取到尽头,'engineer',r索引是7
str1[0:] # 左闭右开,留空即取到尽头,'engineer'
str1[:] # 左闭右开,留空即取到尽头,'engineer'
str1[7:0:-1] # 左闭右开,逆序索引要倒写,'reenign'
str1[7::-1] # 左闭右开,逆序索引要倒写,留空即取到尽头,'reenigne'
str1[-1:-8:-1] # 左闭右开,逆序索引要倒写,'reenign'
str1[-1::-1] # 左闭右开,逆序索引要倒写,留空即取到尽头,'reenigne'
str1[::-1] # 左闭右开,逆序索引要倒写,留空即取到尽头,'reenigne'
字符串取长度
len('dianzi jishu') # 空格占字符串长度,12
dir()查看对象属性和方法
- 在 python 中任何东西都是对象,一种数据类型,一个模块等,都有子集的属性和方法。
- 使用 dir()函数可以查看对象内的所有的属性和方法。
- 使用help来看方法的定义
dir(str1) #看字符串类型里有什么函数
str1.count('n') #count函数用来找字符串中有几个n
# 记不住,找百度!
help(str1.count) #找count函数的定义来知道作用
字符串常用函数
str1.find()
str1.index
str1.split
str1.startswith
str1.endswith
str1.find
str1.replace
str1.strip
str1.upper
str1.lower
str1.capitalize
str1.format
字符串的格式化输出
-
%
number = 43
print('计192班人数是', number,'人!') #计192班人数是 43 人!
rate = 10/43 # 注:%前不加逗号。
print('女生比例是%s!'%rate) #女生比例是0.23255813953488372!
rate = 10/43 # 注:%前不加逗号,.2是小数点后2位
print('女生比例是%.2f!'%rate) #女生比例是0.23!
class1 = '计192'
girl = 10
rate = 0.23
height = 1.62
print('班级%s的女生有%d人,占比%.2f,平均身高%i'%(class1,girl,rate,height)) # 注:%前不加逗号
-
format
print('班级{}的女生有{}人,占比{},平均身高{}'.format(class1,girl,rate,height)) #班级计192的女生有10人,占比0.23,平均身高1.62 class1 = '计192' girl = 10 rate = 0.23 height = 1.62 print('班级{}的女生有{:d}人,占比{:.2f},平均身高{:.1f}'.format(class1,girl,rate,height)) # 注:.format #班级计192的女生有10人,占比0.23,平均身高1.6 class1 = '计192' girl = 10 rate = 0.23 height = 1.62 print('班级{0}的女生有{1}人,占比{2},平均身高{3}'.format(class1,girl,rate,height)) #班级计192的女生有10人,占比0.23,平均身高1.62 print('班级{class1}的女生有{girl}人,占比{rate},平均身高{height}'.format(class1='计192',girl=10,rate=0.23,height=1.62)) #班级计192的女生有10人,占比0.23,平均身高1.62
-
f-string
-
python3.6版本新加入
class1 = '计192' girl = 10 rate = 0.23 height = 1.62 print(f'班级{class1}的女生有{girl}人,占比{rate},平均身高{height}') #加f #班级计192的女生有10人,占比0.23,平均身高1.62
列表List
- List(列表) 是 Python 中使用最频繁的数据类型。
- 列表是写在方括号 [ ] 之间、用逗号分隔开的元素列表。
- List(列表)就好比一个杂货铺,可以包含各种数据类型,如整数、浮点数、字符串甚至列表(所谓嵌套)。
- 和字符串一样,列表同样可以被索引和截取,列表被截取后返回一个包含所需元素的新列表。
- 加号 + 是列表连接运算符,星号 * 是重复操作。
- 与Python字符串不一样的是,列表中的元素是可以改变的。
list1 = [1,2,3,4,5]
list2 = ['dianzi','jishu',1,[8,9]]
print(list2)
len(list2)
list2[3]
#['dianzi', 'jishu', 1, [8, 9]]
#4
#[8, 9]
列表的常用函数
dir(list) #查看列表有什么可用函数
- 对这些对象的方法的使用,就是变量名后加“.”
- 例:list2.append、list2.clear、list2.copy、list2.count、list2.extend、list2.index、list2.insert、list2.pop、list2.remove、list2.reverse、list2.sort
list2 = ['dianzi','jishu',1,[8,9]]
list2.append([5,1]) #在列表后面追加列表
list2
#['dianzi', 'jishu', 1, [8, 9], [5, 1]]
list2 = ['dianzi','jishu',1,[8,9]]
list2.extend([5,1]) #在列表后面追加两个数字
list2
#['dianzi', 'jishu', 1, [8, 9], 5, 1]
- 分析向列表添加元素,.append( ), .extend( ), .insert( )区别;
- 分析从列表删除元素,.pop( ), .del( ), .remove( )区别。
append使用注意事项
-
append是对对象a1的原地操作,列表对象本身保留在相同的内存位置,python的垃圾回收机制保证对象的id在该对象的生命周期内是持久的。
a0 = 3 #定义一个整数 b0 = a0 + 1 #对整数进行计算 print(id(a0)) print(id(b0)) #94814296744800 #94814296744832 a1 = [1,2,3,4] #定义一个列表 print(a1) print(id(a1)) a1.append(5) # 对列表进行追加 print(id(a1)) # 两次print的对象均为a1 print(a1) #[1, 2, 3, 4] #140144678978096 #140144678978096 #[1, 2, 3, 4, 5] a1 = [1,2,3,4] print(a1) print(id(a1)) b1 = a1.append(5) print(b1) # 把append这个操作赋给b1,给列表添加元素不存在返回值,故返回None print(id(b1)) print(a1) type(b1) #类型为空类型 #[1, 2, 3, 4] #140144674601952 #None #94814296608656 #[1, 2, 3, 4, 5] #NoneType
列表的复制
a1 = [4,3,1,5]
b1 = a1
a1.append(6)
print(a1)
print(b1) # 只改变了a1,b1也跟着改变
#[4, 3, 1, 5, 6]
#[4, 3, 1, 5, 6]
-
a1=b1,只是创建了一个新的标签指向列表,并没有生成一个新的列表
-
切片运算符[:] 返回一个序列的切片。切片过程是切下列表的一部分,创建新的列表,将切下的部分复制到新列表。
a1 = [4,3,1,5]
b1 = a1
b2 = a1[:]
print(b1)
print(b2)
print(id(b1))
print(id(b2)) #地址不一样,b2是另一个列表,而不只是标签
#[4, 3, 1, 5]
#[4, 3, 1, 5]
#140167970389760
#140167968865568
a1.append(6)
print(b1)
print(b2)
#[4, 3, 1, 5, 6]
#[4, 3, 1, 5]
- 把b2 = a1[:] 换成 b2=list(a1) 是一样的
元组(Tuple)
- 元组(tuple)与列表类似,不同之处在于元组的元素不能修改。元组写在小括号 () 里,元素之间用逗号隔开。
- 元组也可以使用+操作符进行拼接。
- 虽然tuple的元素不可改变,但它可以包含可变的对象,比如list列表。
- 构造包含 0 个或 1 个元素的元组比较特殊,所以有一些额外的语法规则。
tup = (1,2,3,4,5)
tup = ('dianzi','jishu',1,[8,9]) #列表[],元组()
print(tup)
#('dianzi', 'jishu', 1, [8, 9])
tup1 = () #创建空元组
print(tup1)
#()
- 元组中只包含一个元素时,需要在元素后面添加逗号
tup2 = ('Prada')
type(tup2)
#str
tup2 = ('Prada',) #元组中只包含一个元素时,需要在元素后面添加逗号
type(tup2)
#tuple
6 * 'Parda'
#'PardaPardaPardaPardaPardaParda'
6 *( 'Prada',) # 加逗号以后才是元组,生成有6个这个的新元组
#('Prada', 'Prada', 'Prada', 'Prada', 'Prada', 'Prada')
-
元组中的元素不可赋值修改
-
元组添加元素的方法:把元组切片后再拼接
tup3 = ('Coach','LV','Prada') #元组不支持修改 #tup3[0] = 'Burberry' 出错 #tup3.append(('Burberry',)) 元组不能append tup = tup3[:1] + ('Burberry',) + tup3[1:] tup #('Coach', 'Burberry', 'LV', 'Prada'),左开右闭 tup = tup3[:] + ('Burberry',) tup #('Coach', 'LV', 'Prada', 'Burberry') tup = ('Burberry',) + tup3[:] tup #('Burberry', 'Coach', 'LV', 'Prada')
字典(Dictionary)
字典(dictionary)是Python中另一个非常有用的内置数据类型。
列表是有序的对象集合,字典是无序的对象集合。两者之间的区别在于:字典当中的元素是通过键来存取的,而不是通过偏移存取。
字典是一种映射类型,用 { } 标识,它是一个无序的 键(key) : 值(value) 的集合。
键(key)必须使用不可变类型。
在同一个字典中,键(key)必须是唯一的。
price = {'Coach':1000,'LV':2000,'Prada':3000}
type(price)
#dict
price = {'Coach':1000,'LV':4000,'Prada':3000,'LV':2000} #不允许同一个键出现两次。
price #“取值以后为主”
#{'Coach': 1000, 'LV': 2000, 'Prada': 3000}
#price = {['Coach']:1000,['LV']:2000,['Prada']:3000,'LV':4000},错误
#键不可以是列表,可以用数字,字符串或元组
price['Coach'] # 访问“键”,返回“Value”
#1000
price['Burberry'] = 4000 #添加字典内容
price
#{'Coach': 1000, 'LV': 4000, 'Prada': 3000, 'Burberry': 4000}
del price['LV'] # 删除字典内容
price
#{'Coach': 1000, 'Prada': 3000}
dir(dict) #查看字典可用的函数
集合(Set)
集合(set)和字典(dict)类似,也是一组key的集合,但不存储value。由于key不能重复,所以,在set中没有重复的key。
基本功能是进行成员关系测试和删除重复元素。
可以使用大括号 { } 或者 set() 函数创建集合,注意:创建一个空集合必须用 set() 而不是 { },因为 { } 是用来创建一个空字典。
s = {3, 4 , 4 ,6 , 7,}
s
#{3, 4, 6, 7}
dir(set)
数据类型间的切换
- 不可变数据(3 个):Number(数字)、String(字符串)、Tuple(元组);
- 可变数据(3 个):List(列表)、Dictionary(字典)、Set(集合)。
a = 8
b = 0.3
c = True
d = 4 + 5j
e = 'zongjie'
list1 = [2,'g',False] #列表
tuple1 = (2,'g',False) #元组
dict1 = {'Coach':1000,'LV':2000,'Prada':3000} #字典
set1 = {2,3,4,5,6,6} #集合
int(5.6) #5
str(78) #'78'
bool(8) #True
float('7.3') #7.3
float('7.4') #7.4
int(float('7.4')) #字符串无法一步转为整型,7
set([1,1,2,3,4]) #{1, 2, 3, 4}
list({1,3,4,5}) #[1, 3, 4, 5]
list((2,3,6)) #[2, 3, 6]
深复制、浅复制
- Python中的对象之间赋值时是按引用传递的,如果需要复制对象,需要使用标准库中的copy模块。
-
- copy.copy:浅复制 只复制父对象,不会拷复制对象内部的子对象。
-
- copy.deepcopy:深复制 复制对象及其子对象
import copy
a = [1, 2, 3, 4, ['a', 'b']] #原始对象
b = a #赋值,传对象的引用
c = a[:] #列表切片
d = copy.copy(a) #对象复制,浅复制
e = copy.deepcopy(a) #对象复制,深复制
a.append(5) #修改对象a
a[4].append('c') #修改对象a中的['a', 'b']数组对象
print(a)
print(b)
print(c)
print(d)
print(e)
print(id(a))
print(id(b))
print(id(c))
print(id(d))
print(id(e))
#[1, 2, 3, 4, ['a', 'b', 'c'], 5]
#[1, 2, 3, 4, ['a', 'b', 'c'], 5]
#[1, 2, 3, 4, ['a', 'b', 'c']]
#[1, 2, 3, 4, ['a', 'b', 'c']]
#[1, 2, 3, 4, ['a', 'b']]
#140144682972656
#140144682972656
#140145062160736
#140144689397840
#140145062162096