1.函数 匿名函数lambda
'''
函数
'''
# 万物皆对象
# 对象就会有内存地址,就会有一个引用
# 通过这个引用就可以找到该对象并使用它
def show():
print('Hello Python')
show()
# 将一个函数的引用赋值给另外一个变量
func = show
print(func)
print(show)
func()
def display():
print('Display run ')
# 实现一个可以调用另外一个函数的函数
def call_function(func):
func()
call_function(show)
call_function(display)
# 定义一个匿名函数
func = lambda : 1 + 1
print(func)
print(func())
func = lambda x: print(x ** 10)
func(2)
# lambda 定义时的注意事项
# 1. lambda 默认返回表达计算结果,不需要return ,如果加了reutrn 反而报错
# func = lambda x, y: return x + y
# 2. 不能使用 循环
# func = lambda x,y: for i in range(x, y): print(i)
# func = lambda x,y: i = x while i < y: print(i) i +=1
# 3. 不能使用if的正常格式
# func = lambda n: if n % 2 == 0: print('偶数')
# 4. 但是可以使用 if实现的三目运算符
func = lambda m, n: m if m > n else n
print(func(11, 2))
2.高阶函数
'''
map 函数
作用:是对参数列表中的元素做一个映射
'''
my_list = [1, 2, 3, 4, 5]
# 这个函数是为了给map的参数进行传参
# 因为map函数需要使用这个函数来计算每一个元素的映射值
# 所以该函数有且必须只能有一个参数
def f(x):
return x ** 3
# result_list = map(f, my_list)
# 利用lambda 来替代函数进行传参
result_list = map(lambda n: n ** 4, my_list)
for i in result_list:
print(i)
print(type(result_list))
# map实现原理
def my_map(func, c_list):
# 定义一个新空列表 ,保存映射结果
new_list = []
# 遍历源列表 中的数据
for i in c_list:
# 调用函数计算映射值 ,并保到新列表中
# new_list.append(func(i))
n = func(i)
new_list.append(n)
return new_list
result_list = my_map(lambda n: n ** 4, my_list)
for i in result_list:
print(i)
'''
高阶函数-reduce 累加器
'''
# 注意:reduce 不能直接使用,需要导入一个模块 functools
# reduce 作用是根据传入的参数一对参数二中的数据进行累计
import functools
# my_list = ['h','e','l','l','o']
my_list = list('hello')
result = functools.reduce(lambda s1,s2: s1 + s2, my_list)
# result = functools.reduce(lambda s1,s2: s1.upper() + s2.upper(), my_list)
print(result)
# 练习 :使用 reduce 求阶乘
my_list = [i for i in range(1,6)]
result = functools.reduce(lambda n1,n2: n1 * n2, my_list)
print(result)
'''
filter 过滤函数
'''
my_list = ['123','234','abc','@#$',' ','abc234','132abc']
# 过滤出所有的数字字符串
num_list = filter(lambda s: s.isdigit(), my_list)
print(num_list)
for s in list(num_list):
print(s)
3.sort函数 与 lambda函数
'''
函数sort
'''
my_list = [7,2,4,1,5,8,9,3,6,0]
my_list.sort()
print(my_list)
my_list = [{'id': 1,'name': 'tom','age':12},{'id': 3,'name': 'rose','age':32},{'id': 2,'name': 'Jack','age':22}]
# 默认sort方法是不能对字典进行比较排序的,TypeError: '<' not supported between instances of 'dict' and 'dict'
# 按id的升序排序
# my_list.sort(key=lambda d: d['id'])
# 按年龄降序排序
my_list.sort(key=lambda d: d['age'],reverse=True)
print(my_list)
4.文件读写
'''
文件基本操作
'''
# 打开文件的模式 rt wt rb wb
# file = open('a.txt','w')
# file = open('a.txt','r')
file = open('a.txt','rt')
# 关闭文件
file.close()
'''
文件读取
'''
# 打开文件,以读取模式
file = open('a.txt','rt')
# 读取文件内容
# 默认读取全部文件内容
# 但是这种方式 只适用于文件比较小的情况
# 如果文件比较大,不建议这样读取
# content = file.read()
# # 在读取数据时,指定读取一部分
# content = file.read(6)
#
# # 显示读取的文件内容
# print(content)
# 读取多行文件的方式
while True:
# 读取
content = file.read(4096)
# 如果在文件读取时,读取的结果为 空串,说明文件读取完毕
# 根据这个条件 可以设置读取文件的结束条件
if content == '':
break
print(content,end='')
# 关闭文件
file.close()
# 以行的形式读取文件
# 打开文件
file = open('a.txt','r')
# 以行读取 readline()
# while True:
# content = file.readline()
# if content == "":
# break
# print(content)
# 以行的方式 读取整 个文件 readlines
content_list = file.readlines()
print(content_list)
for line in content_list:
print(line)
print(line.upper()
#新建一个copy.py文件 用sys模块 使用键盘输入 src dst 进行文件拷贝
#执行方式:python3 copy.py a.txt b.txt 这时候 下面的sys.argv会获取到输入的 a.txt 和 b.txt
'''
实现了一个复制命令
'''
import sys
def file_copy(src, dst):
# 以读取的方式 打开源文件
file_r = open(src, 'r')
# 以写的方式打开目标文件
file_w = open(dst, 'w')
# 循环
while True:
# 读取文件内容
content = file_r.read(1024)
# 将读取的文件内容 写入到另一个文件中
if content == '':
print('文件拷贝成功')
break
# 写入文件
file_w.write(content)
# 关闭文件
file_r.close()
file_w.close()
print(sys.argv)
src = sys.argv[1]
dst = sys.argv[2]
file_copy(src,dst)
5.os模块函数 实现批量读取文件并复制
'''
os 模块
rename()
remove()
mkdir()
getcwd()
chdir()
listdir() 掌握
rmdir()
'''
# 导入 os 模块
# os -> operator system -> 操作系统
import os
# rename 重命名
# os.rename('a.txt','b.txt')
# mkdir 创建目录 make directory
# 如果当前目录 存在,会报错
# os.mkdir('test_dir')
# getcwd 获取当前工作目录 get current work directory
cwd = os.getcwd()
print(cwd)
# listdir () 获取当前目录下的文件列表
file_list = os.listdir('.')
print(file_list)
for file in file_list:
print(file)
# chdir() 改变当前目录 到指定 的路径 上去。 change directory
os.chdir('C:\\Users\\Desktop')
print(os.getcwd())
print(os.listdir('.'))
# remove() 删除一个文件
# os.remove('aaa.txt')
# rmdir() 删除一个文件夹 remove directory
# os.rmdir('PycharmProjects/Day06/test_dir')
# 当目录 不为空,不能删除
os.rmdir('a')
'''
批量读取文件,改名之后去复制
'''
# C:/Users/Desktop/
# 因为要使用文件操作功能 ,所以要导入 os 模块
import os
def muilt_file_copy(src, dst):
# 获取当前工作目录
print(os.getcwd())
# 切换目录 到 源文件目录中
os.chdir(src)
# 从源当中去读取所有的文件信息
file_list = os.listdir(src)
# print(file_list)
# 创建出一个新的目标文件夹
os.mkdir(dst)
# 循环 读取文件次数
# 遍历每一个文件
for file in file_list:
# 对文件改名,遍历的文件就是需要复制的源文件,改名后的文件就是要复制出来的文件
# 先对源文件名进行分割
s_file = file.rpartition('.')
# C:/Users/Desktop/v_bak/v3_bak.mp4
dst_file = dst + '/' + s_file[0] + '_bak' + s_file[1] + s_file[2]
print(dst_file)
# print(dst_file)
# 分别以读写方式打开源和目标文件
file_r = open(file,'rb')
file_w = open(dst_file,'wb')
# 读取内容,写入内容
while True:
content = file_r.read(1024)
# 因为打开文件时,使用的是二进制模式打开,所以在判断结束时,需要判断是否是一个二进制空字符串,b''
if content == b'':
print(f'{file} 复制成功。。')
file_r.close()
file_w.close()
break
# 如果读取内容不是空,将读取内容 写入到目标文件
file_w.write(content)
else:
print(f'一共复制了{len(file_list)}个文件')
# 源文件夹
src = 'C:/Users/Desktop/v'
# 目标文件夹
dst = 'C:/Users/Desktop/v_bak'
# muilt_file_copy(src,dst)