Python第五天

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)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值