切片:
[start_index: stop_index: step]
start_index: stop_index 参数都可以省略 默认 全部 但必须有一个 :
demo:
start_index和stop_index的绝对值是可以大于length的。比如下面两个例子:?
1
2
3
4
5
|
>>> alist = [ 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 ] >>> alist[ - 11 : 11 ] [ 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 ] >>> alist[ 11 : - 11 : - 1 ] [ 9 , 8 , 7 , 6 , 5 , 4 , 3 , 2 , 1 , 0 ] |
另外start_index和stop_index都是可以省略的,比如这样的形式 alist[:]
, 被省略的默认由其对应左右边界起始元素开始截取。
看一下具体的实例:?
1
2
3
|
>>> alist = [ 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 ] >>> alist[:] [ 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 ] |
函数默认参数: 陷阱
def qqxing(k,l = {}):
# l.append(1)
l[k] = 'v'
print(l)
qqxing(1) #[1]
qqxing(2) #[1,1]
qqxing(3) #[1,1,1]
# 如果默认参数的值是一个可变数据类型,
# 那么每一次调用函数的时候,
# 如果不传值就公用这个数据类型的资源
def func(l):
return l[1::2] #切片 从 第一个, 从1 开始 不是 0 2 4
print(func([1,2,3,4,5]))
def func(l):
return l[:2]
print(func([1,2,3,4]))
######## 全局变量变量名大写
######## 局部变量变量名小写
# 优先读取局部变量,能读取全局变量,无法对全局变量重新赋值 NAME=“fff”,
# 但是对于可变类型,可以对内部元素进行操作
# 如果函数中有global关键字,变量本质上就是全局的那个变量,可读取可赋值 NAME=“fff”
高阶函数
一 #filter函数
movie_people=['alex_sb','wupeiqi_sb','linhaifeng','yuanhao_sb']
def sb_show(n):
return True
def sb_show(str):
# return str.endswith('sb');
#
# print(list(filter(sb_show,movie_people))) ####注意 sb_show是变量 不是字符串
二、map函数
num_l = [1,2,10,5,3,7]
# print(list(map(lambda x:x+1,num_l))
def add_one(x):
return x+1
print(list(map(add_one,num_l)) ####注意 add_one 是变量 不是字符串
三、reduce函数, py3 要自己引入,因为已经删除内置
from functools import reduce
def add(x,y):
return x + y
print(reduce(add,list(range(1,100))))
匿名函数;没有实际名字的函数。
func=lambda x:x+'_sb'
res=func(name)
print('匿名函数的运行结果',res)
#处理序列中的每个元素,得到的结果是一个‘列表’,该‘列表’元素个数及位置与原来一样
# map()
#filter遍历序列中的每个元素,判断每个元素得到布尔值,如果是True则留下来
people=[
{'name':'alex','age':1000},
{'name':'wupei','age':10000},
{'name':'yuanhao','age':9000},
{'name':'linhaifeng','age':18},
]
print(list(filter(lambda p:p['age']<=18,people)))
#reduce:处理一个序列,然后把序列进行合并操作
from functools import reduce
print(reduce(lambda x,y:x+y,range(100),100))
print(reduce(lambda x,y:x+y,range(1,101)))
# 文件处理
# 打开文件
#open('路径','打开方式','指定编码方式')
# 打开方式 r w a r+ w+ a+ b
# ‘r+’读+追加模式,可读可写,
# ‘w+’写读模式,打开创建新文件,因此需要先把内容写进去在读
# ‘a’追加模式,若打开的是已有文件则直接对已有文件操作
文件打开,替换
with open('小护士班主任',encoding='utf-8') as f,open('小护士班主任.bak','w',encoding='utf-8') as f2:
for line in f:
if '星儿' in line: # 班主任:星儿
line = line.replace('星儿','啊娇')
f2.write(line)
f=open('test22.py','ab') #b的方式不能指定编码
f.write('杨件'.encode('utf-8'))
open('a;ltxt','wt')
# print(f.tell())
# f.readline()
# print(f.tell())
# f.seek(1)
# print(f.tell())
# print(f.readlines())
# f.seek(3)
# print(f.tell())
# print(f.read())
# data=f.read(1)
# print(data)
# f.truncate(10)
# f.flush() #讲文件内容从内存刷到硬盘
#
# f.closed #文件如果关闭则返回True
#
# f.encoding #查看使用open打开文件的编码
# f.tell() #查看文件处理当前的光标位置
#
# f.seek(3) #从开头开始算,将光标移动到第三个字节
# f.truncate(10) #21以写方式打开,但是w和w+除外
#
# f=open('d.txt','r',newline='')
#
# data=f.readline().encode('utf-8')
# print(data)
# print(f.tell())
f=open('日志文件','rb')
# for i in f.readlines():
# print(i)
#循环文件的推荐方式
# for i in f:
# print(i)
for i in f:
offs=-10
while True:
f.seek(offs,2)
data=f.readlines()
if len(data) > 1:
print('文件的最后一行是%s' %(data[-1].decode('utf-8')))
break
offs*=2