import functools
import logging
import os, time, random
import traceback
import datetime
from multiprocessing import Process, Pool
logging.basicConfig(level=logging.WARNING)
# 多进程
# Python的os模块封装了常见的系统调用,其中就包括fork,可以在Python程序中轻松创建子进程
# print('Process (%s) start...' % os.getpid())
# # Only works on Unix/Linux/Mac:
# pid = os.fork()
# if pid == 0:
# print('I am child process (%s) and my parent is %s.' % (os.getpid(), os.getppid()))
# else:
# print('I (%s) just created a child process (%s).' % (os.getpid(), pid))
# 由于Windows没有fork调用,上面的代码在Windows上无法运行。
# multiprocessing 模块是跨平台版本的多进程模块
# multiprocessing模块提供了一个Process类来代表一个进程对象,下面的例子演示了启动一个子进程并等待其结束:
# 子进程要执行的代码
def run_proc(name):
print('Run child process %s (%s)...' % (name, os.getpid()))
if __name__ == '__main__':
print('Parent process %s.' % os.getpid())
p = Process(target=run_proc, args=('test',))
print('Child process will start.')
p.start()
p.join()
print('Child process end.')
# 如果要启动大量的子进程,可以用进程池的方式批量创建子进程
# Pool的默认大小是CPU的核数
def long_time_task(name):
print('Run task %s (%s)...' % (name, os.getpid()))
start = time.time()
time.sleep(random.random() * 3)
end = time.time()
print('Task %s runs %0.2f seconds.' % (name, (end - start)))
if __name__ == '__main__':
print('Parent process %s.' % os.getpid())
p = Pool(4)
for i in range(5):
p.apply_async(long_time_task, args=(i,))
print('Waiting for all subprocesses done...')
p.close()
p.join()
print('All subprocesses done.')
# 操作文件和目录
# 查看当前目录的绝对路径:
os.path.abspath('.')
# 在某个目录下创建一个新目录,首先把新目录的完整路径表示出来:
# os.path.join('/Users/michael', 'testdir')
# 然后创建一个目录:
# os.mkdir('/Users/michael/testdir')
# 删掉一个目录:
# os.rmdir('/Users/michael/testdir')
# 把两个路径合成一个时,不要直接拼字符串,而要通过os.path.join()函数,这样可以正确处理不同操作系统的路径分隔符。
# 同样的道理,要拆分路径时,也不要直接去拆字符串,而要通过os.path.split()函数,这样可以把一个路径拆分为两部分,后一部分总是最后级别的目录或文件名:
# os.path.splitext()可以直接让你得到文件扩展名
# 列出当前目录下的所有目录,只需要一行代码:
dirs = [x for x in os.listdir('.') if os.path.isdir(x)]
print(dirs)
# 要列出所有的.py文件,也只需一行代码
files = [x for x in os.listdir('.') if os.path.isfile(x) and os.path.splitext(x)[1] == '.py']
print(files)
# 获取本机CPU核数
print("本机为", os.cpu_count(), "核 CPU")
# 查看环境变量
# print(os.environ)
# 获取某个环境变量的值
print(os.environ.get('PYTHONPATH'))
# 读取文件编码问题
# 遇到有些编码不规范的文件,你可能会遇到UnicodeDecodeError,因为在文本文件中可能夹杂了一些非法编码的字符。
# 遇到这种情况,open()函数还接收一个errors参数,表示如果遇到编码错误后如何处理。最简单的方式是直接忽略:
# f = open('/Users/michael/gbk.txt', 'r', encoding='gbk', errors='ignore')
# 断言
# 凡是用print()来辅助查看的地方,都可以用断言(assert)来替代
# 启动Python解释器时可以用-O参数来关闭assert 如:$ python -O err.py
def foo(s):
n = int(s)
assert n != 0, 'n is zero!'
return 10 / n
foo('1')
# 记录错误
# Python内置的logging模块可以非常容易地记录错误信息,而且程序打印完错误信息后会继续执行,并正常退出:
def bar(s):
ren = 10 / int(s)
return ren
def main_1():
try:
bar('0')
except Exception as e:
logging.exception(e)
main_1()
# 装饰器
# 把@log放到now()函数的定义处,相当于执行了语句:now = log(now)
def log(text):
def decorator(func):
@functools.wraps(func)
def wrapper(*args, **kw):
try:
start_time = time.time()
f = func(*args, **kw)
run_time = time.time() - start_time
nowTime = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
print('%s 运行 %s s\n当前时间:%s\n%s' % (func.__name__, run_time, nowTime, text))
return f
except Exception as e:
print('%s出错:%s' % (func.__name__, traceback.print_exc()))
return wrapper
return decorator
@log("测试文本")
def now():
print('2015-3-25')
now()
# 匿名函数
# 关键字lambda表示匿名函数,冒号前面的x表示函数参数
# 如以下简单函数可写为匿名函数并赋值给一个变量,再利用变量来调用该函数
# def f(x):
# return x.replace('-','')
f = lambda x: x.replace('-', '')
print(f('5-4'))
print('END')
Python 学习笔记_基础记录
最新推荐文章于 2024-08-01 19:45:58 发布
这篇博客详细记录了Python编程的基础知识,包括语法、数据类型、控制结构、函数等内容,适合初学者入门学习。
摘要由CSDN通过智能技术生成