三、深复制和浅复制
1.字符串的拼接
例: a = 'hello' , b = 'python' , c = '!' 将a,b ,c 中的字符串连成一句话。
第一种方法:用+号
s='i love python' s1='!!' s+s1 #'i love python!!'
第二种方法:格式化字符串 %s
格式化字符串的%s部分称为转换说明符,标记了需要放置转换值的位置,通用术语为占位符。
s='i' s1='love' s2='python' s3='%s '%s #'i ' 单个可括号也可以不用 s3='%s %s %s '%(s,s1,s2) #'i love python ' 一一对应的(占位符)输出来的还是字符串
第三种方法:''.join()方法
S.join(iterable) -> str 只有一个参数,对象必须是可迭代(列表,元组,字符串)的,并且元素必须是字符串
''.join([s,s1,s2]) #'ilovepython' ' '.join([s,s1,s2]) #'i love python' 加了个空格 ' '.join((s,s1,s2)) #用元组 ' '.join('s,s1,s2') #失去了变量含义
第四种方法:'{}'.format(s)
跟第二种方法类似都有占位符 'i'
#'{} {}'.format(s) #IndexError: tuple index out of range '{} {}'.format(s,s1) #括号和参数对应 'i love',当{}里面是空的时候,里面默认索引为0,1按format括号里的顺序依次填入 '{0} {1} {2}'.format(s,s1,s2) #有索引的 '{1} {2} {0}'.format(s,s1,s2) #可以变顺序 '{1} {1} {1}'.format(s,s1,s2) #love love love '{0} {0} {0}'.format([s,s1,s2]) #"['i', 'love', 'python'] ['i', 'love', 'python'] ['i', 'love', 'python']" #因为第一个0 有一个列表元素,没有1索引 '{0[0]} {0[1]} {0[2]}'.format([s,s1,s2]) #'i love python' #'{0} {0} {0}'.format(a=s,b=s1,c=s2) #指定了对象后,会失去位置,运行报错 #IndexError: tuple index out of range(前面也要指定) #{}里面可以指定对象名称,后面通过赋值的方式给前面的相应的值,后面是无序的 '{a} {c} {b}'.format(a=s,b=s1,c=s2) #后面指定了之后,前面必须要用名字指定位置
format补充 也可以格式化输入
'{}'.format(12.22) '{:.1f}'.format(12.22) #'12.2' 保留1位小数 '{:.2%}'.format(12.2222) #'1222.22%' 百分比 '{:<10}'.format(12) #'12 ' <左对齐,10代表输出占10位 '12 ' '{:>10}'.format(12) #' 12' >右对齐,输出占10位 '{:^10}'.format(12) #' 12 ' 居中 '{:*^10}'.format(12) #'****12****' 用*来填充 '{:a^10}'.format(12) #'aaaa12aaaa'
2.格式化输出
下面介绍基本转换说明符。注意,这些项的顺序至关重要:
(1)%字符:标记转换说明符开始
(2)转换标志(可选):-表示左对齐;+表示在转换值之前要加上正负号;0表示转换值位数不够时用0填充(大于0的话会被认成字段宽值);“ ”(空字符)表示正数之前保留空格
(3)最小字段宽度(可选):转换后的字符串至少应该具有该值指定的宽度。如果是*,宽度就会从值元组中读出
(4)点(.)后跟精度值(可选):如果转换的是实数,精度值表示出现在小数点后的位数;如果转换的是字符串,该数字就表示最大字段宽度;如果是*,精度就会从元组中读出
(5)转换类型
%s 格式化字符串
'%s'%'lucky' #'lucky' '%8s'%'lucky' #' lucky' 默认右对齐,前面用空格补齐 前面加数字表示宽度 '%-8s'%'lucky' #'lucky ' -号表示左对齐 '%s'%'%' #% '%*s'%(10,565) #' 565'
%d 格式化整数
'%d'%1.11 #'1' 输出的还是字符串 print('%d'%1.111) #1 格式化整数
%f 格式化小数
若不指定精度,则默认输出6位小数
'%f'%1.111 #'1.111000' 默认保留6位小数 #m.n m是显示的最小长度,当m大于格式化位数时才起作用显示m位,n是代表小数的位数。 '%2f'%1.111 #长度为2,又保留6位小数 相当于2.6 默认先看精度 '%.2f'%1.111 #保留2位小数 '%6.2f'%1.111 #' 1.11' '%2.1f'%123.111111 #'123.1' 优先以精度为准 '%06.2f'%1.111 #'001.11' #用0填充
%c 格式化ASCII字符(把数字转换成字母)
'a'>'A' #True '%c'%65 #'A' '%c'%97 #'a'
%o 格式化八进制
'%o'%7 #'7' '%o'%8 #'10' '%o'%16 #'20
%x 格式化十六进制
'%x'%16 #'10' '%x'%10 #'a' '%x'%15 #'f'
%e 用科学计数法格式化
'%e'%100 #'1.000000e+02'
+号 显示后面数的正负
'%+6.2f'%1.111 #' +1.11' '%+6.2f'%-1.111 #' -1.11'
2.1转义字符
换行 a 提示音(需要在cmd里) 退格 制表符
print('www mmm') print(r'www mmm') #取消字符串的转义 print(r'www\nmmm') #取消转义 print('a') print('abde') print('abc tt')
3.深浅复制 (有嵌套的列表)
元组和列表之间的相互嵌套(字符串里面都会变成字符串,失去列表和元组的方法),嵌套之后可以通过索引值来取数
复制都是分配俩个地址,只不过浅复制只能复制外面的,复制不了嵌套在里面的
同一个地址针对的是嵌套在里面序列类型
·浅复制:copy() 切片
·深复制:import copy copy.deepcopy()
li=['a','b'] lu=[1,li] lu #[1,['a','b'] lu[1][1] #'b' lq=lu.copy() #[1,['a','b'] 属于浅复制 id(lu) #57977352 id(lq) #58255120 id(lu[1]) #57977832 id(lq[1]) #57977832 import copy ls=copy.deepcopy(lu) #[1, ['a', 'b']] id(lu[1]) #57977832 id(ls[1]) #58069800 #说明内列表变了 li.append('c') li #['a', 'b', 'c'] lq #[1,['a', 'b', 'c']] #浅复制还是同一个对象 ls #[1, ['a', 'b']] #深复制不是同一个对象了 lqq=lu[:] #[1, ['a', 'b', 'c']] li.append('d') #[1, ['a', 'b', 'c', 'd']]