第六章:Python基础の反射与常用模块解密

本課主題

  • 反射 Mapping 介绍和操作实战
  • 模块介绍和操作实战
  • random 模块
  • time 和 datetime 模块
  • logging 模块
  • sys 模块
  • os 模块
  • hashlib 模块
  • re 模块
  • 本周作业

反射 Mapping 介绍和操作实战

反射是利用字符串的形式去对象 (模块) 中操作 (寻找/检查) 成员

案例例子

假设创建了一个common.py 程序里而有3个功能,比如网站里的登录页面、主页页面还有登出页面都是不同的页面,要显示的内容都不一样。

def login():
    print("Login Page")

def logout():
    print("Logout Page")

def home():
    print("HomePage")

common.py

再创建一个py程序:index.py,程序一般是做一个判断然后会基于调用不同的功能来返回不同的结果(参考调用方法一的代码)。

import common

#根据用户不同的输入而返回不同的信息
def run():
    inp = input("请输入要访问的 url: ")
    if inp == "login": # 当用户输入 login,还看到 login 页面
        common.login()
    elif inp == "logout": # 当用户输入 logout,还看到 logout 页??面
        common.logout()
    elif inp == "home": # 当用户输入 home,还看到 home 页面
        common.home()
    else:
        print("404")

if __name__ == "__main__":
    run()

index.py 调用方法一

其实此时可以使用反射的方法(参考调用方法二的代码),直接基于用户输入,

# 利用字符串的形式去对象 (模块) 中操作 (寻找/检查) 成员

import common

def run():
    inp = input("请输入要访问的 url: ")
    is_exists = hasattr(common,inp) # 检查用户输入是否在common模块里存在的一个成员
    if is_exists:
        func = getattr(common, inp) # 到common模块寻找用户输入的一个成员
        func()
    else:
        print("404")

if __name__ == "__main__":
    run()

index.py 调用方法二

运用 hasattr( ) 和 getattr( )函数来实现,這兩個反射函数分別接收兩個参数(参数一可以是模块, 参数二是参数一的成員)。

hasattr(参数一,参数二) # 到模块里检查成员
#参数一可以是模块, 参数二是参数一的成员
getattr(参数一,参数二) # 到模块里寻找成员
#参数一可以是模块, 参数二是参数一的成员

模块介绍和操作实战

random 模块

random( ) 函数是用来随机生成数字

import random

word_list = []
for i in range(6):
    random_num = random.randrange(0, 5)
    if random_num == 2 or random_num == 4:
        num = random.randrange(0, 10)
        word_list.append(str(num))
    else:
        temp = random.randrange(65, 91)
        word = chr(temp)
        word_list.append(word)

words = "".join(word_list)
print(words)

random( )函数

time 和 datetime 模块

time

  1. 从1970年1月1号12:00am 开始计算的一个时间戳 Unix timestamp

    import time
    
    >>> print(time.time())
    1473427097.89171

    time.time()

  2. 返回当前系统时间转换成 字符串类型

    import time
    
    >>> print(time.ctime())
    Fri Sep  9 21:28:13 2016
    
    >>> print(time.ctime(time.time()-86400))
    Thu Sep  8 21:29:06 2016

    time.ctime( )

  3. 返回当前系统时间转换成 struct_time类型

    >>> import time
    
    >>> time_obj = time.gmtime() 
    
    >>> print(time_obj)
    time.struct_time(tm_year=2016, tm_mon=9, tm_mday=9, tm_hour=13, tm_min=29, tm_sec=41, tm_wday=4, tm_yday=253, tm_isdst=0)
    
    >>> print(time_obj.tm_year,time_obj.tm_mon)
    2016 9
    
    >>> type(time_obj)
    <class ‘time.struct_time‘>
    
    >>> ret = "Year={year} Month={mnth}".format(year=time_obj.tm_year,mnth=time_obj.tm_mon)
    
    >>> print(ret)
    Year=2016 Month=9
    
    >>> time_pre_obj = time.gmtime(time.time()-86400) # 返回struct_time类型
    >>> print(time_pre_obj)
    time.struct_time(tm_year=2016, tm_mon=9, tm_mday=8, tm_hour=13, tm_min=34, tm_sec=49, tm_wday=3, tm_yday=252, tm_isdst=0)

    time.gmtime( )

  4. 按本地时间来显示时间,并且返回 struct_time类型

    >>> print(time.localtime())
    time.struct_time(tm_year=2016, tm_mon=9, tm_mday=9, tm_hour=21, tm_min=38, tm_sec=47, tm_wday=4, tm_yday=253, tm_isdst=0)
    
    >>> time_obj = time.localtime()
    
    >>> print(time_obj)
    time.struct_time(tm_year=2016, tm_mon=9, tm_mday=9, tm_hour=21, tm_min=38, tm_sec=59, tm_wday=4, tm_yday=253, tm_isdst=0)
    
    >>> type(time_obj)
    <class ‘time.struct_time‘>

    time.localtime( )

  5. 把一个struct_time类型转换成时间戳

    >>> print(time.mktime(time_obj))
    1473428339.0

    time.mktime( )

  6. 让时间睡眠

    >>> time.sleep(4)
    >>> print("--------")

    time.sleep( )

  7. 將 struct_time 类型转换成字符串类型 (from struct_time to string)

    >>> print(time.strftime("%Y-%m-%d %H:%M:%S",time.gmtime()))
    2016-09-09 13:47:50
    
    >>> print(time.strftime("%Y-%m-%d %H:%M:%S",time.localtime()))
    2016-09-09 21:47:51

    time.strftime( )

  8. 將字符串类型转换成 struct_time 类型 (from string to struct_time)

    >>> tm = time.strptime("2016-09-03","%Y-%m-%d")  # 將字符串类型转换成struct_time类型
    
    >>> print(tm)
    time.struct_time(tm_year=2016, tm_mon=9, tm_mday=3, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=5, tm_yday=247, tm_isdst=-1)
    
    >>> type(tm)
    <class ‘time.struct_time‘>
    
    >>> print(time.mktime(tm))
    1472832000.0

    time.strptime( )

Datetime

  1. 输出:2016-09-03

    >>> import datetime
    >>> d1 = datetime.date.today()
    >>> print(d1)

    datetime.date.today()

  2. 时间戳直接转成日期格式 2016-08-19

    >>> d2 = datetime.date.fromtimestamp(time.time());
    >>> print(d2)
    2016-09-09

  3. current time

    >>> current_time = datetime.datetime.now()
    >>> print(current_time)
    2016-09-09 21:59:45.125933

    datetime.datetime.now()

  4. 返回  struct_time 类型

    >>> t = current_time.timetuple()
    
    >>> print(t)
    time.struct_time(tm_year=2016, tm_mon=9, tm_mday=9, tm_hour=21, tm_min=59, tm_sec=45, tm_wday=4, tm_yday=253, tm_isdst=-1)
    
    >>> type(t)
    <class ‘time.struct_time‘>

    timetuple( )

  5. 时间的加减在Python中会调用datetime.timedelta ( )

    >>> d3 = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
    
    >>> print(d3)
    2016-09-09 22:03:29
    
    >>> new_date = datetime.datetime.now() + datetime.timedelta(days=10)
    >>> print(new_date)
    2016-09-19 22:03:38.745696
    
    >>> new_hour = datetime.datetime.now() + datetime.timedelta(hours=4)
    >>> print(new_hour)
    2016-09-10 02:03:41.642530
    
    >>> new_hour = datetime.datetime.now() + datetime.timedelta(hours=4)
    >>> print(new_hour)
    2016-09-10 02:03:44.630359

    时间的加减

  6. datetime.datetime.strptime( )

    >>> tm = datetime.datetime.strptime("2016-09-03","%Y-%m-%d")
    >>> print(tm)
    2016-09-03 00:00:00

    strptime( )

  7. replace( )

    >>> current_time = datetime.datetime.now()
    >>> print(current_time)
    2016-09-09 22:07:10.352970
    
    >>> replace_time = current_time.replace(2015,5)
    >>> print(replace_time)
    2015-05-09 22:07:10.352970
    
    >>> print(type(current_time))
    <class ‘datetime.datetime‘>
    
    >>> print(type(replace_time))
    <class ‘datetime.datetime‘>

    replace( )

Date Format

[更新中]

logging 模块

logging 基礎

每个程序都需要有日志记录,日志有几个级别:1. DEBUG; 2.INFO; 3. WARNING; 4.ERROR; 5.CRITICAL

import logging

logging.warning("User [alex] attempt wrong password for more than 3 times")
logging.critical("Server is down")

logging.debug(‘This message should go to the log file‘)
logging.info(‘So should this‘)
logging.warning(‘And this, too‘)

#WARNING:root:User [alex] attempt wrong password for more than 3 times
#CRITICAL:root:Server is down
#WARNING:root:And this, too

logging

想输出日志到文件可以调用以下函数,filename: 文件名,filemode: 写入模式,level: 日志的级别 (跟这个级别同等或者是比这个更高级别的日志才会写入文件)

logging.basicConfig(filename=‘log.txt‘,filemode=‘w‘,level=logging.INFO)

把 basicConfig 加到程序中然后执行程序,因为日志级别是INFO,所以这里的结果是只有INFO级别或以上的,才会写入log.txt的文件里

import logging

logging.basicConfig(filename=‘log.txt‘,filemode=‘w‘,level=logging.INFO)

logging.warning("User [alex] attempt wrong password for more than 3 times")
logging.critical("Server is down")
logging.debug(‘This message should go to the log file‘)
logging.info(‘So should this‘)
logging.warning(‘And this, too‘)

#log.txt 会有INFO级别或以上的日志
"""
WARNING:root:User [alex] attempt wrong password for more than 3 times
CRITICAL:root:Server is down
INFO:root:So should this
WARNING:root:And this, too
"""

Log写进文件的例子

basicConfig可以传入很多不同的参数

logging.basicConfig(filename=‘log.txt‘,
                    level=logging.DEBUG,
                    format=‘%(asctime)s %(message)s‘,
                    datefmt=‘%m/%d/%Y %I:%M:%S %p‘)

執行

import logging

logging.basicConfig(filename=‘log.txt‘,
                    level=logging.DEBUG,
                    format=‘%(asctime)s %(message)s‘,
                    datefmt=‘%m/%d/%Y %I:%M:%S %p‘)

logging.warning("User [alex] attempt wrong password for more than 3 times")
logging.critical("Server is down")
logging.debug(‘This message should go to the log file‘)
logging.info(‘So should this‘)
logging.warning(‘And this, too‘)

# log.tx.
"""
09/09/2016 11:15:35 PM User [alex] attempt wrong password for more than 3 times
09/09/2016 11:15:35 PM Server is down
09/09/2016 11:15:35 PM This message should go to the log file
09/09/2016 11:15:35 PM So should this
09/09/2016 11:15:35 PM And this, too
"""

Log写进文件的例子二

logging 進階

如果想打印日誌到文件和 Console 上,必需要了解以下概念:

  1. 第一步,创建 Logger,然后设置全区的日志级别。(会比较全区和区部的日志级别,较高的那个会成为该日志输出级别)

    logger = logging.getLogger(‘TEST-LOG‘)
    logger.setLevel(logging.INFO) #configure a global logging level

    logger

  2. 第二步、创建Console Handler 对象,也可以设置 Console 控制台的日志级别,不可以比全区的日志记录级别小,CRITICAL> ERROR> WARNING> INFO> DEBUG。也就是说这两个日志记录级别会比较然后选出最大的那个日志记录级别

    console_handler = logging.StreamHandler() #print the log on the console
    console_handler.setLevel(logging.DEBUG)

    console_handler

  3. 第三步、创建File Handler 对象,也可以设置 File Handler 的日志级别。

    file_handler = logging.FileHandler("access.log")
    file_handler.setLevel(logging.WARNING)

    file_handler

  4. 第四步、创建 Formatter,这是决定输出的格式

    formatter = logging.Formatter(‘%(asctime)s - %(name)s - %(filename)s - %(levelname)s - %(message)s - %(lineno)s - %(process)d‘)

    formatter

  5. 第五步、把 Formatter 加到 console_handler 和 file_handler,各自可以有不同的输出格式

    console_handler.setFormatter(formatter)
    file_handler.setFormatter(formatter)

    setFormatter(formatter)

  6. 第六步、把 Handler 加到 console_handle 和 file_handler 对象里

    logger.addHandler(console_handler)
    logger.addHandler(file_handler)

    addHandler( )

把以上第1步 到 第6步加起來:

import logging

#create logger
logger = logging.getLogger(‘TEST-LOG‘)
logger.setLevel(logging.INFO) #configure a global logging level

# create console handler and set the level to debug
console_handler = logging.StreamHandler() #print the log on the console
console_handler.setLevel(logging.DEBUG) #override the global logging configuration level and specifiy the configuration on the console

# create file handler and set level to warning
file_handler = logging.FileHandler("access.log")
file_handler.setLevel(logging.WARNING) #override the global logging configuration level and specifiy the configuration on the file_system

# create formatter
formatter = logging.Formatter(‘%(asctime)s - %(name)s - %(filename)s - %(levelname)s - %(message)s - %(lineno)s - %(process)d‘)

# add formatter to ch and fh
console_handler.setFormatter(formatter)
file_handler.setFormatter(formatter)

# add console_handler and ffile_handler to logger
# 把日志打印到指定的Handler里
logger.addHandler(console_handler)
logger.addHandler(file_handler)

# ‘application‘ code
logger.debug(‘debug message‘)
logger.info(‘info message‘)
logger.warn(‘warn message‘)
logger.error(‘error message‘)
logger.critical(‘critical message‘)

# Console
"""
2016-09-09 23:26:25,907 - TEST-LOG - loggingOps_2.py - INFO - info message - 32 - 1168
2016-09-09 23:26:25,908 - TEST-LOG - loggingOps_2.py - WARNING - warn message - 33 - 1168
2016-09-09 23:26:25,909 - TEST-LOG - loggingOps_2.py - ERROR - error message - 34 - 1168
2016-09-09 23:26:25,910 - TEST-LOG - loggingOps_2.py - CRITICAL - critical message - 35 - 1168
"""

# access.log
"""
2016-09-04 00:54:05,713 - TEST-LOG - loggingOps_2.py - WARNING - warn message - 33 - 4827
2016-09-04 00:54:05,714 - TEST-LOG - loggingOps_2.py - ERROR - error message - 34 - 4827
2016-09-04 00:54:05,714 - TEST-LOG - loggingOps_2.py - CRITICAL - critical message - 35 - 4827
2016-09-09 23:26:25,908 - TEST-LOG - loggingOps_2.py - WARNING - warn message - 33 - 1168
2016-09-09 23:26:25,909 - TEST-LOG - loggingOps_2.py - ERROR - error message - 34 - 1168
2016-09-09 23:26:25,910 - TEST-LOG - loggingOps_2.py - CRITICAL - critical message - 35 - 1168
"""

完整日志代码例子

logging 的參數

[更新中]

sys 模块

os 模块

hashlib 模块

首先创建一个MD5对象

re 模块

本周作业

計算器, +-*/

8*12+(6-(5*6-2)/77+2)*(3-7)+8

需求

  1. 從前到後找,找到第一個(開始)結尾,中間不含有括號
  2. \(中間不包含括號\)
  3. def 處理加減乘除(表達式)
  4. def 處理括號(表達式):
         while True:
               re.split("\(中間不包含括號\)"),表達式,1)

參考資料

[金角大王] Python 之路 Day5 - 常用模块学习 http://www.cnblogs.com/alex3714/articles/5161349.html

[銀角大王] Python开发【第六篇】:模块 - http://www.cnblogs.com/wupeiqi/articles/5501365.html

时间: 2024-10-05 15:07:55

第六章:Python基础の反射与常用模块解密的相关文章

萌新向Python数据分析及数据挖掘 第一章 Python基础 第八节 函数

第一章 Python基础 第八节 函数 定义函数 函数 其实就可以理解为外挂,把一些常用的.重复率比较多你又不想重复写的东西写进函数,加上开关实现简化操作 举个简单的例子 1 def greet_user(username): 2 #定义一个叫做"迎接用户"的外挂,让他能直接打印一个问候语,括号里面是函数需要输入的东西,也就是个性化的东西 3 """先是简单的问候语""" 4 print("Hello! "

【WPF学习】第三十六章 样式基础

原文:[WPF学习]第三十六章 样式基础 前面三章介绍了WPF资源系统,使用资源可在一个地方定义对象而在整个标记中重用他们.尽管可使用资源存储各种对象,但使用资源最常见的原因之一是通过他们的保存样式. 样式是可应用于元素的属性值集合.WPF样式系统与HTML标记中的层叠样式表(Cascading Style Sheet,CSS)标准担当类似的角色.与CSS类似,通过WPF样式可定义通用的格式化特性集合,并且为了保证一致性,在整个应用程序中应用他们.与CSS一样,WPF样式也能够自动工作,指定具体

萌新向Python数据分析及数据挖掘 第一章 Python基础 (上)未排版

因word和博客编辑器格式不能完全对接,正在重新排版,2019年1月1日发出第一章完整版 本文将参考<Python编程 从入门到实践>的讲述顺序和例子,加上自己的理解,让大家快速了解Python的基础用法,并将拓展内容的链接添加在相关内容之后,方便大家阅读. 好了!我们开始第一章的学习. 第一章 Python基础 python安装以及环境搭建 python的安装和环境变量的配置通过百度查询即可解决,这里不作赘述. IDE的选择:因为后期需要用来做数据分析,所以直接安装Anaconda会是一个不

萌新向Python数据分析及数据挖掘 第一章 Python基础 第一节 python安装以及环境搭建 第二节 变量和简单的数据类型

本文将参考<Python编程 从入门到实践>的讲述顺序和例子,加上自己的理解,让大家快速了解Python的基础用法,并将拓展内容的链接添加在相关内容之后,方便大家阅读. 好了!我们开始第一章的学习. 第一章 Python基础 第一节 Python安装以及环境搭建 Python的安装和环境变量的配置通过百度查询即可解决,这里不作赘述. IDE的选择:因为后期需要用来做数据分析,所以直接安装Anaconda会是一个不错的选择. Anaconda详细安装使用教程 https://blog.csdn.

萌新向Python数据分析及数据挖掘 第一章 Python基础 第九节 类

第一章 Python基础 第九节 类 面向对象编程时,都会遇到一个概念,类,python也有这个概念,下面我们通过代码来深入了解下. 其实类 和函数都是为了节省代码,有了类的的概念,就可以把相同的代码写在父类,子类继承后就可以直接使用,而且通过选择对应的父类就可以直接使用对应父类的内容. 创建和使用类 1 class Dog(): #认识狗这类东西 2 def __init__(self, name, age): #狗是肯定有名字和年龄的,是个狗就有,要用户填写 3 self.name = na

萌新向Python数据分析及数据挖掘 第一章 Python基础 第十节 文件和异常

第一章 Python基础 第十节 文件和异常 从文件中读取数据 读取文件.文件路径   1 filename = 'pi_digits.txt' #文件名取个代号 2 #读取整个文件 3 with open(filename) as file_object: 4 contents = file_object.read()# 给内容取个代号 5 print(contents.rstrip()) 6 #逐行读取 7 with open(filename) as file_object: 8 for

python基础学习日志day5-各模块文章导航

python基础学习日志day5---模块使用 http://www.cnblogs.com/lixiang1013/p/6832475.html python基础学习日志day5---time和datetime模块 http://www.cnblogs.com/lixiang1013/p/6848245.html python基础学习日志day5---random模块http://www.cnblogs.com/lixiang1013/p/6849162.html python基础学习日志da

第一章 Python基础知识

1.1 介绍  1.1.1 特点 Python是一种面向对象.解释型计算机程序设计语言.语法简洁清晰,强制用空白符作为语句缩进. Python具有丰富和强大的库,又被称为胶水语言.能把其他语言(主要C/C++)写的模块很轻松的结合在一起. 1.1.2 应用领域 Web网站:有很多优秀的开源Web框架,比如Django(最流行).Tornado(轻量级.异步).Flask(微型).Web.py(简单)等. 数据采集:有好用的http库,比如urllib2.requests等.还有高级的屏幕爬取及网

Python学习—基础篇之常用模块

常用模块 模块,用一砣代码实现了某个功能的代码集合. 类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合.而对于一个复杂的功能来,可能需要多个函数才能完成(函数又可以在不同的.py文件中),n个 .py 文件组成的代码集合就称为模块. python常用模块主要有: 1. time模块 2. random模块 3. hashlib模块 4. os模块 5. sys模块 6. logging模块 7. 序列化模块 8. configpar