• 进击python第4篇:初探模块


    模块,用一砣代码实现了某个功能的代码集合,任何python程序都可以作为模块导入,n个 .py 文件组成的代码集合就称为模块。

    but 为什么要引入模块概念?主要原因是代码重用(code reuse)。请记住:为了让代码可重用,请将它模块化!!!

    模块分为三种:

    • 自定义模块
    • 内置模块
    • 开源模块

    定义模块

    1.单个py文件就可作为模块

    425762-20151120210254796-391850912

    2.为了组织好模块,将它们分组为包(package),当模块存储在py文件中时,包就是模块所在的目录。记住:为了让python将其作为包对待,必须包含一个名为__init__.py的模块

    425762-20151120204617843-2002471507

    接下来,如何使用模块?就需要将放置在定义的path路径中的模块导入

    路径(linux环境下):

    >>> import sys,pprint
    >>> pprint.pprint(sys.path)
    ['',
     '/usr/lib64/python26.zip',
     '/usr/lib64/python2.6',
     '/usr/lib64/python2.6/plat-linux2',
     '/usr/lib64/python2.6/lib-tk',
     '/usr/lib64/python2.6/lib-old',
     '/usr/lib64/python2.6/lib-dynload',
     '/usr/lib64/python2.6/site-packages',
     '/usr/lib/python2.6/site-packages']
    >>>

    打印sys模块(python解释器相关)中path变量,可以看出是列表,因此:

    >>> sys.path.append('/root/')
    >>> pprint.pprint(sys.path)  
    ['',
     '/usr/lib64/python26.zip',
     '/usr/lib64/python2.6',
     '/usr/lib64/python2.6/plat-linux2',
     '/usr/lib64/python2.6/lib-tk',
     '/usr/lib64/python2.6/lib-old',
     '/usr/lib64/python2.6/lib-dynload',
     '/usr/lib64/python2.6/site-packages',
     '/usr/lib/python2.6/site-packages',
     '/root/']
    >>>

    导入方法:

    import module
    from module.xx.xx import xx
    from module.xx.xx import xx as rename  
    from module.xx.xx import *

    探究模块

    Python之所以应用越来越广泛,在一定程度上也依赖于其为程序员提供了大量的模块以供使用,那如何获知模块能做什么?授之以鱼不如授之以渔

    以copy模块为例

    1.使用tab键

    参考readline和rlcompleter模块,做如下操作

    [root@test site-packages]# cd /usr/lib/python2.6/site-packages
    [root@test site-packages]# vim tab.py
      1 #!/usr/bin/python
      2 import sys
      3 import readline
      4 import rlcompleter
      5 import os
      6 readline.parse_and_bind('tab: complete')
      7 histfile =os.path.join(os.environ['HOME'],'.pythonhistory')

    [root@test site-packages]# python   
    >>> import tab,copy
    >>> copy.  #tab键
    copy.Error(                   copy.__package__              copy._deepcopy_dispatch
    copy.PyStringMap              copy.__reduce__(              copy._deepcopy_inst(
    copy._EmptyClass              copy.__reduce_ex__(           copy._deepcopy_list(
    copy.__all__                  copy.__repr__(                copy._deepcopy_method(
    copy.__class__(               copy.__setattr__(             copy._deepcopy_tuple(
    copy.__delattr__(             copy.__sizeof__(              copy._keep_alive(
    copy.__dict__                 copy.__str__(                 copy._reconstruct(
    copy.__doc__                  copy.__subclasshook__(        copy._test(
    copy.__file__                 copy._copy_dispatch           copy.copy(
    copy.__format__(              copy._copy_immutable(         copy.deepcopy(
    copy.__getattribute__(        copy._copy_inst(              copy.dispatch_table
    copy.__hash__(                copy._copy_with_constructor(  copy.error(
    copy.__init__(                copy._copy_with_copy_method(  copy.name
    copy.__name__                 copy._deepcopy_atomic(        copy.t(
    copy.__new__(                 copy._deepcopy_dict(         

    2.dir

    >>> import copy
    >>> [n for n in dir(copy) if not n.startswith('_')]
    ['Error', 'PyStringMap', 'copy', 'deepcopy', 'dispatch_table', 'error', 'name', 't']

    3.help

    使用help获取模块具体功能

    >>> help(copy.copy)
    Help on function copy in module copy:
    
    copy(x)
        Shallow copy operation on arbitrary Python objects.
        
        See the module's __doc__ string for more info.

    4.第三方开发工具pycharm

    当然最快捷的就是使用第三方工具

    下载地址:http://www.jetbrains.com/pycharm/download/

    快速激活方法:http://idea.lanyus.com/ (>_<)

    image

    标准库:一些最爱

    1.os

    用于提供访问多个操作系统级别的操作

    os.mkdir('dirname') 生成单级目录;相当于shell中mkdir dirname

    os.makedirs('dirname1/dirname2') 可生成多层递归目录

    os.rmdir('dirname') 删除单级空目录,若目录不为空则无法删除,报错;相当于shell中rm dirname

    os.removedirs('dirname1') 若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推

    os.listdir('dirname') 列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印

    os.sep 输出操作系统特定的路径分隔符,win下为"\",Linux下为"/"

    os.system("bash command") 运行shell命令,直接显示,但拿不到返回值

    os.name 输出字符串指示当前使用平台。win->'nt'; Linux->'posix'

    os.path.exists(path) 如果path存在,返回True;如果path不存在,返回False

    os.path.isabs(path) 如果path是绝对路径,返回True

    os.path.isfile(path) 如果path是一个存在的文件,返回True。否则返回False

    os.path.isdir(path) 如果path是一个存在的目录,则返回True。否则返回False

    os.path.getatime(path) 返回path所指向的文件或者目录的最后访问时间

    os.path.getmtime(path) 返回path所指向的文件或者目录的最后修改时间

    os.system:用于运行外部程序,例如启动浏览器

    unix中:os.system(‘/usr/bin/firefox’)

    windows:os.system(r’c:”Program Files””Mozilla FireFox”firefox.exe’)

    注意:将Program Files和Mozilla FireFox作为整体字符串放入引号,以免程序误解;同此,window引用特有函数—os.startfile:

    windows:os.system(r’c:Program FilesMozilla FireFoxfirefox.exe’)

    为了更简洁,启动浏览器引入了webbrowser模块:

    >>> import webbrowser
    >>> webbrowser.open('http://www.baidu.com')
    True

    之后网页就以默认的浏览器打开,简洁吧?

    2.fileinput

    前面介绍了文件操作open()或file(),同此fileinput模块可轻松地遍历文本文件中的所有行

    fileinput.filename 返回正在处理的文件名

    fileinput.lineno 返回处理过的行数,数值是累加的

    fileinput.filelineno 返回当前文件处理的行数

    fileinput.nextfile 会关闭当前文件,跳到下一文件

    fileinput.close 结束迭代

    fileinput.input 模块中最重要的函数,返回用于for循环遍历对象

    3.Json/Pickle

    用于序列化的两个模块

    • · json,用于字符串 和 python数据类型间进行转换
    • · pickle,用于python特有的类型 和 python的数据类型间进行转换

    Json模块提供了四个功能:dumps、dump、loads、load

    pickle模块提供了四个功能:dumps、dump、loads、load

    json和xml共同作用都是不同语言、程序之间的数据交换,充当翻译角色

    import pickle
    import json
    #json用于处理常用的数据类型如字典、序列
    dic = {
        'lzl':{"age":22},
        'bruce':{'age':25}
    }
    li = [1,2,'a','v']
    ###dumps 不会写入,所以需用write写入文件
    # transfer = json.dumps(dic)
    # transfer1 = json.dumps(li)
    # print type(transfer) #<type 'str'>
    # print type(transfer1)#<type 'str'>
    
    # with open('to_disk.txt','r+') as obj:
    #     obj.write(transfer+'
    ')
    #     obj.write(transfer1)
    ###dump 会写入文件
    with open('to_disk.txt','w') as obj:
         json.dump(dic,obj)
    
    ###loads读取
    # with open('to_disk.txt','rb') as obj1:
    #      ret = json.loads(obj1.read())
    #      print ret,type(ret)
    with open('to_disk.txt','rb') as obj1:
         ret = json.load(obj1)
         print ret,type(ret)#<type 'dict'>
    
    #pikle
    # with open('to_disk.txt','w') as obj:
    #      ret = pickle.dump(dic,obj)
    #      print type(ret) #<type 'NoneType'>

    pickle为python特有且处理的数据类型较json多

    4.time

    时间相关的操作,时间有三种表示方式:

    • · 时间戳               1970年1月1日之后的秒,即:time.time()
    • · 格式化的字符串    2014-11-11 11:11, 即:time.strftime('%Y-%m-%d')
    • 结构化时间 元组包含了:年、日、星期等... time.struct_time    即:time.localtime()
    时间戳
    
    >>> time.time()
    
    1453536914.157
    
    >>> time.mktime(time.localtime())
    
    1453536984.0
    
    格式化的字符串
    
    >>> time.strftime('%Y-%m-%d',time.localtime())
    
    '2016-01-23'
    
    >>> time.asctime()
    
    'Sat Jan 23 16:36:36 2016'
    
    >>> time.ctime(time.time())
    
    'Sat Jan 23 16:37:27 2016'
    
    结构化时间
    
    >>> time.strptime('2014-11-11', '%Y-%m-%d')
    
    time.struct_time(tm_year=2014, tm_mon=11, tm_mday=11, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=1, tm_yday=315, tm_isdst=-1)
    
    print time.gmtime()    #可加时间戳参数
    
    print time.localtime() #可加时间戳参数
    
    >>> t= time.localtime()
    
    >>> t
    
    time.struct_time(tm_year=2016, tm_mon=1, tm_mday=23, tm_hour=16, tm_min=54, tm_sec=42, tm_wday=5, tm_yday=23, tm_isdst=0)
    
    >>> t.tm_yday #通过类似索引获取
    
    23

    5.random

    random模块包含返回随机数的函数,模拟或用于任何产生随机输出的程序

    random() 返回0<n<=1之间的随机实数

    uniform(a,b) 返回随机实数n ,a<=n<b

    shuffle(seq[,random]) 传入可变序列,对元素进行随机移位

    sample(seq,n) 从序列中选择n个随机且独立的元素

    模拟投色子机制:

    
    
    1 from random import randrange
    2 num = input('how many dice?')
    3 sides = input('how many sides per die?')
    4 n = 0
    5 for i in range(num):n += randrange(sides) + 1
    6 print  'The total points is :',n
    输出:

    how many dice?4
    how many sides per die?6
    The total points is : 17

    以上为学习要点笔记记录,更多参考武sir博客

  • 相关阅读:
    Intersection Observer 观察元素何时进入或退出浏览器的视口
    JS防抖函数、节流函数工具类封装
    页面刷新时,如何保持原有vuex中的state信息
    vue具名插槽、作用域插槽的新写法
    vue-cli3+工具中,配置路径别名(vue.config.js)
    基于Vue-SSR优化方案归纳总结
    React组件设计:重新认识受控与非受控组件
    如何用 JavaScript 实现一个数组惰性求值库
    原生 js 中应该禁止出现的写法,以提高代码效率和安全性
    Javascript 实践中的命令模式
  • 原文地址:https://www.cnblogs.com/lizhilin/p/5135167.html
Copyright © 2020-2023  润新知