将一个文件的内容写入到另一个文件、map、reduce、filter函数、正则表达式匹配电话号码、函数引用外部名称空间的情况、 生成器、迭代器、可迭代对象 以及应用场景、常见的内置函数、
写一段代码, 逐行读入一个中文档案(编码为utf-8), 输出在屏幕上并合并(去掉换行), 输出另外一个档案. import os def handler(): path = input("请输入文件路径:") new_file_name = 'new_' + os.path.basename(path) try: with open(path, 'r', encoding='utf-8') as old_file: try: while True: line_data = old_file.readline() if line_data: # 输出到屏幕 print(line_data, end='') # 写入另一个文件 with open(new_file_name, 'a+', encoding='utf-8') as new_file: new_file.write(line_data.strip('\n')) else: print('\n读写完毕') return except Exception as e: print(e) except Exception as e: print("文件打开失败")
filter、map、reduce的作用#
1)filter(func, iterable) : 通过判断函数fun,筛选符合条件的元素。
filter(lambda x: x>3, [1,2,3,4,5,6]) >>> <filter object at 0x0000000003813828>
2)map(func, *iterable) : 将func用于每个iterable对象。
map(lambda a,b: a+b, [1,2,3,4], [5,6,7]) >>> [6,8,10]
3)reduce() 函数会对参数序列中元素进行累积。
1、a_list = [1,2,3,4,5,6,7,8,9] 请写出你想到的最精简的代码: 把每个元素都加1 a_list = list(map(lambda element: element + 1, a_list)) 2、 请把偶数去掉 a_list = list(filter(lambda element: element % 2 == 0, a_list)) 3、请把list中的每个元素相乘 from functools import reduce result = reduce(lambda element1, element2: element1 * element2 , a_list)
请使用正则模块re从一段字符串取得所有的电话号码, 其中电话号码可变。
s="This is our Chinese homepage.我们公司的客服电话号码:02-2511-6530。若要购买商品编号为:05-1423,请来电0928837577。"
import re def get_phone_number(text): # 提取固话没分机号码的正则 phoneRegex = re.compile(r'''( (\d{2}|\(\d{2}\))? # 匹配区号,'?'表示区号可有可无 (\s|-|\.)? # 分隔符 ,比如 02-3333-3333,'?'表示分隔符可有可无 (\d{4}) # 号码中前面4个数字 (\s|-|\.)? # 分隔符 (\d{4}) # 最后的4个数字 )''', re.VERBOSE) # re.VERBOSE:为了正则中写注释 matches = [] # 匹配成功的邮箱和电话存放到matches列表中 for groups in phoneRegex.findall(text): # 遍历匹配到的电话列表 phoneNum = '-'.join([groups[1], groups[3], groups[5]]) # 统一格式 matches.append(phoneNum) return matches if __name__ == "__main__": text = "This is our Chinese homepage.我们公司的客服电话号码:02-2511-6530。若要购买商品编号为:05-1423,请来电0928837577。" print(get_phone_number(text))
# 第一种: 内层函数使用变量接收for循环的i变量 def Foo1(): list1 = [] for i in range(4): def f(n, m=i): return m * n list1.append(f) return list1 # 第二种: 列表生成式的匿名函式引用for循环的i变量 list2 = [lambda n: n * i for i in range(4)] # 第三种: for循环闭包的i参数引用 def Foo3(): list3 = [] for i in range(4): def f(n): return i * n list3.append(f) return list3 # 第四种: 加码, 内层函数引用for循环的i变量并且使用可变参数*args def Foo4(): list4 = [] for i in range(4): def f(*args): return i * args list4.append(f) return list4 # 循环遍历每个函数,获取输出的值 for index, func_list in enumerate([Foo1(), list2, Foo3(), Foo4()]): print("Foo%d的输出结果:" % (index + 1), end='\t') for func in func_list: print(func(10), end='\t') print() 解释部分: 第一种情况:内层函数直接把外层函数的变量保存到一个变量中的时候,相当于设置了一个默认值, 那么默认值是一个确定的值,所以保存的是一个值而不是空间。
所以,每一个匿名函数存进去的m的值都是不同的 第二种情况:是第三种情况的一个简写,效果是一样,在这里一并分析就好了.在Python中, 当a函数使用非局部变量的时候,a函数里面保存的是这个非局部变量的内存空间,
当非局部变量发生变化时, a函数相对应的那个变量也会同时发生变化,
因为指向的是同一个内存空间.回到我们的例子, Foo3里面for的i相对与f函数来说就是一个非局部变量,
所以生成的每个f函数或者list2列表里面匿名函数的i其实存放的是Foo3里面for的i这个全局变量(对于f来说是全局变量)的地址,
所以外部的i发生变化,引用它的所有的函数的i的也一同更新了,所以才会看到这种现象。 第四种情况:理解了前面的情况,第四种就容易理解多了,可以确定的是,函数列表里面i最后的值都是3。那么,只要理解了定义函数时*args的作用就OK了。
定义函数时*args的作用:把调用函数时传过来的多余的参数放入到一个元组中,
所以如果你打印args的话其实是这样的:(10,) ,那么乘上3, 就是(10, 10, 10)了。
简述 生成器、迭代器、可迭代对象 以及应用场景#
1)可迭代对象:只要它定义了可以返回一个迭代器的__iter__方法,或者定义了可以支持下标索引的__getitem__方法,那么它就是一个可迭代对象。
2)迭代器:迭代器是通过next()来实现的,每调用一次他就会返回下一个元素,当没有下一个元素的时候返回一个StopIteration异常,所以实际上定义了next()方法的都算是迭代器。
3)生成器:生成器是构造迭代器的最简单有力的工具,与普通函数不同的只有在返回一个值的时候使用yield来替代return,然后yield会自动构建好next()和iter()
4)生成器最佳应用场景是:你不想同一时间将所有计算出来的大量结果集分配到内存当中,特别是结果集里还包含循环。
列举常见的内置函数#

数学相关 abs(a) : 求取绝对值。abs(-1) max(list) : 求取list最大值。max([1,2,3]) min(list) : 求取list最小值。min([1,2,3]) sum(list) : 求取list元素的和。 sum([1,2,3]) >>> 6 sorted(list) : 排序,返回排序后的list。 len(list) : list长度,len([1,2,3]) divmod(a,b): 获取商和余数。 divmod(5,2) >>> (2,1) pow(a,b) : 获取乘方数。pow(2,3) >>> 8 round(a,b) : 获取指定位数的小数。a代表浮点数,b代表要保留的位数。round(3.1415926,2) >>> 3.14 range(a[,b]) : 生成一个a到b的数组,左闭右开。 range(1,10) >>> [1,2,3,4,5,6,7,8,9] 类型转换 int(str) : 转换为int型。int('1') >>> 1 float(int/str) : 将int型或字符型转换为浮点型。float('1') >>> 1.0 str(int) : 转换为字符型。str(1) >>> '1' bool(int) : 转换为布尔类型。 str(0) >>> False str(None) >>> False bytes(str,code) : 接收一个字符串,与所要编码的格式,返回一个字节流类型。 bytes('abc', 'utf-8') >>> b'abc' bytes(u'爬虫', 'utf-8') >>> b'\xe7\x88\xac\xe8\x99\xab' list(iterable) : 转换为list。 list((1,2,3)) >>> [1,2,3] iter(iterable): 返回一个可迭代的对象。 iter([1,2,3]) >>> <list_iterator object at 0x0000000003813B00> dict(iterable) : 转换为dict。 dict([('a', 1), ('b', 2), ('c', 3)]) >>> {'a':1, 'b':2, 'c':3} enumerate(iterable) : 返回一个枚举对象。 tuple(iterable) : 转换为tuple。 tuple([1,2,3]) >>>(1,2,3) set(iterable) : 转换为set。 set([1,4,2,4,3,5]) >>> {1,2,3,4,5} set({1:'a',2:'b',3:'c'}) >>> {1,2,3} hex(int) : 转换为16进制。hex(1024) >>> '0x400' oct(int) : 转换为8进制。 oct(1024) >>> '0o2000' bin(int) : 转换为2进制。 bin(1024) >>> '0b10000000000' chr(int) : 转换数字为相应ASCI码字符。 chr(65) >>> 'A' ord(str) : 转换ASCI字符为相应的数字。 ord('A') >>> 65 相关操作 eval() : 执行一个表达式,或字符串作为运算。 eval('1+1') >>> 2 exec() : 执行python语句。 exec('print("Python")') >>> Python filter(func, iterable) : 通过判断函数fun,筛选符合条件的元素。 filter(lambda x: x>3, [1,2,3,4,5,6]) >>> <filter object at 0x0000000003813828> map(func, *iterable) : 将func用于每个iterable对象。 map(lambda a,b: a+b, [1,2,3,4], [5,6,7]) >>> [6,8,10] zip(*iterable) : 将iterable分组合并。返回一个zip对象。 list(zip([1,2,3],[4,5,6])) >>> [(1, 4), (2, 5), (3, 6)] type():返回一个对象的类型或新建类。 id(): 返回一个对象的唯一标识值。 hash(object):返回一个对象的hash值,具有相同值的object具有相同的hash值。 hash('python') >>> 7070808359261009780 help():调用系统内置的帮助系统。 isinstance():判断一个对象是否为该类的一个实例。 issubclass():判断一个类是否为另一个类的子类。 globals() : 返回当前全局变量的字典。 next(iterator[, default]) : 接收一个迭代器,返回迭代器中的数值,如果设置了default,则当迭代器中的元素遍历后,输出default内容。 reversed(sequence) : 生成一个反转序列的迭代器。 reversed('abc') >>> ['c','b','a']
用尽量多的方法实现单例模式:#
1)用new来实现单例 class Singleton(object): def __new__(cls): if not hasattr(cls, 'instance'): cls.instance = super(Singleton, cls).__new__(cls) return cls.instance 2)使用导入模块的方式 class MySingle: def foo(self): pass sinleton = MySingle() # 在别的地方导入 from mysingle import sinleton singleton.foo() 3)使用装饰器 def singleton(cls): instances = {} def getinstance(*args,**kwargs): if cls not in instances: instances[cls] = cls(*args,**kwargs) return instances[cls] return getinstance @singleton class MyClass: a = 1 4)使用元类(metaclass) class Singleton2(type): def __init__(self, *args, **kwargs): self.__instance = None super(Singleton2,self).__init__(*args, **kwargs) def __call__(self, *args, **kwargs): if self.__instance is None: self.__instance = super(Singleton2,self).__call__(*args, **kwargs) return self.__instance class Foo(object, metaclass=Singleton2): pass
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)