zoukankan      html  css  js  c++  java
  • python学习之路day9

    Sorted函数

    a = {6:2,8:0,1:4,-5:6,99:11,4:22}  #a的类型为字典dict, a.items()表示以列表返回

    print( sorted(a.items()) )          #根据key来排序
    print( sorted(a.items(),key=lambda x:x[1]) )  #根据value来排序
    print(a)                  #本身是无序的

    [(-5, 6), (1, 4), (4, 22), (6, 2), (8, 0), (99, 11)]
    [(8, 0), (6, 2), (1, 4), (-5, 6), (99, 11), (4, 22)]
    {1: 4, 99: 11, 4: 22, 6: 2, 8: 0, -5: 6}

     


    json序列化:把内存的数据对象变成字符串    #  json.dumps(内存的数据对象)

    json反序列化:把字符串变成内存的数据对象    #  json.loads(字符串)

    PS:json序列化和反序列化是指用标准通用的形式,保存内存数据对象到文件里,并提取文件里的内存数据对象

    json仅仅适用简单的数据类型(字典,列表等),便于通用于不同编程语言

     


    pickle与json用法完全一样,但是好处是能够序列化python所有的数据类型(甚至函数),不过打开文件要用二进制格式。#  'wb',  'rb'

    但是pickle只能在python里用。

     

    info={
    'name':'Alex',
    'age':'22'
    }

     

    f=open('test.text','wb')

    pickle.dump(info,f)    #与 f,write( pickle.dumps(info) )完全一样的作用

                #pickle.dump(对象,文件)

    f.close()

    f=open('test.text','wb')

     

    data=pickle.load(f)    #与data= pickle.loads(f.read()) 完全一样的作用

     

    f.close()

     

     


     

    总结:dump和load最好各一次(或者把原先的文件覆盖掉)

     


     

     

    目录组织方式

     

    关于如何组织一个较好的Python工程目录结构,已经有一些得到了共识的目录结构。在Stackoverflow的这个问题上,能看到大家对Python目录结构的讨论。

     

    这里面说的已经很好了,我也不打算重新造轮子列举各种不同的方式,这里面我说一下我的理解和体会。

     

    假设你的项目名为foo, 我比较建议的最方便快捷目录结构这样就足够了:

     

    Foo/
    |-- bin/
    |   |-- foo
    |
    |-- foo/
    |   |-- tests/
    |   |   |-- __init__.py
    |   |   |-- test_main.py
    |   |
    |   |-- __init__.py
    |   |-- main.py
    |
    |-- docs/
    |   |-- conf.py
    |   |-- abc.rst
    |
    |-- setup.py
    |-- requirements.txt
    |-- README
    

     

    简要解释一下:

     

    1. bin/: 存放项目的一些可执行文件,当然你可以起名script/之类的也行。
    2. foo/: 存放项目的所有源代码。(1) 源代码中的所有模块、包都应该放在此目录。不要置于顶层目录。(2) 其子目录tests/存放单元测试代码; (3) 程序的入口最好命名为main.py
    3. docs/: 存放一些文档。
    4. setup.py: 安装、部署、打包的脚本。
    5. requirements.txt: 存放软件依赖的外部Python包列表。
    6. README: 项目说明文件。

     

    除此之外,有一些方案给出了更加多的内容。比如LICENSE.txt,ChangeLog.txt文件等,我没有列在这里,因为这些东西主要是项目开源的时候需要用到。如果你想写一个开源软件,目录该如何组织,可以参考这篇文章

     

    下面,再简单讲一下我对这些目录的理解和个人要求吧。

     

    关于README的内容

     

    这个我觉得是每个项目都应该有的一个文件,目的是能简要描述该项目的信息,让读者快速了解这个项目。

     

    它需要说明以下几个事项:

     

    1. 软件定位,软件的基本功能。
    2. 运行代码的方法: 安装环境、启动命令等。
    3. 简要的使用说明。
    4. 代码目录结构说明,更详细点可以说明软件的基本原理。
    5. 常见问题说明。

     

    我觉得有以上几点是比较好的一个README。在软件开发初期,由于开发过程中以上内容可能不明确或者发生变化,并不是一定要在一开始就将所有信息都补全。但是在项目完结的时候,是需要撰写这样的一个文档的。

     

    可以参考Redis源码中Readme的写法,这里面简洁但是清晰的描述了Redis功能和源码结构。

     

    关于requirements.txt和setup.py

     

    setup.py

     

    一般来说,用setup.py来管理代码的打包、安装、部署问题。业界标准的写法是用Python流行的打包工具setuptools来管理这些事情。这种方式普遍应用于开源项目中。不过这里的核心思想不是用标准化的工具来解决这些问题,而是说,一个项目一定要有一个安装部署工具,能快速便捷的在一台新机器上将环境装好、代码部署好和将程序运行起来。

     

    这个我是踩过坑的。

     

    我刚开始接触Python写项目的时候,安装环境、部署代码、运行程序这个过程全是手动完成,遇到过以下问题:

     

    1. 安装环境时经常忘了最近又添加了一个新的Python包,结果一到线上运行,程序就出错了。
    2. Python包的版本依赖问题,有时候我们程序中使用的是一个版本的Python包,但是官方的已经是最新的包了,通过手动安装就可能装错了。
    3. 如果依赖的包很多的话,一个一个安装这些依赖是很费时的事情。
    4. 新同学开始写项目的时候,将程序跑起来非常麻烦,因为可能经常忘了要怎么安装各种依赖。

     

    setup.py可以将这些事情自动化起来,提高效率、减少出错的概率。"复杂的东西自动化,能自动化的东西一定要自动化。"是一个非常好的习惯。

     

    setuptools的文档比较庞大,刚接触的话,可能不太好找到切入点。学习技术的方式就是看他人是怎么用的,可以参考一下Python的一个Web框架,flask是如何写的: setup.py

     

    当然,简单点自己写个安装脚本(deploy.sh)替代setup.py也未尝不可。

     

    requirements.txt

     

    这个文件存在的目的是:

     

    1. 方便开发者维护软件的包依赖。将开发过程中新增的包添加进这个列表中,避免在setup.py安装依赖时漏掉软件包。
    2. 方便读者明确项目使用了哪些Python包。

     

    这个文件的格式是每一行包含一个包依赖的说明,通常是flask>=0.10这种格式,要求是这个格式能被pip识别,这样就可以简单的通过 pip install -r requirements.txt来把所有Python包依赖都装好了。具体格式说明: 点这里

     

     

    关于配置文件的使用方法

     

    注意,在上面的目录结构中,没有将conf.py放在源码目录下,而是放在docs/目录下。

     

    很多项目对配置文件的使用做法是:

     

    1. 配置文件写在一个或多个python文件中,比如此处的conf.py。
    2. 项目中哪个模块用到这个配置文件就直接通过import conf这种形式来在代码中使用配置。

     

    这种做法我不太赞同:

     

    1. 这让单元测试变得困难(因为模块内部依赖了外部配置)
    2. 另一方面配置文件作为用户控制程序的接口,应当可以由用户自由指定该文件的路径。
    3. 程序组件可复用性太差,因为这种贯穿所有模块的代码硬编码方式,使得大部分模块都依赖conf.py这个文件。

     

    所以,我认为配置的使用,更好的方式是,

     

    1. 模块的配置都是可以灵活配置的,不受外部配置文件的影响。
    2. 程序的配置也是可以灵活控制的。

     

    能够佐证这个思想的是,用过nginx和mysql的同学都知道,nginx、mysql这些程序都可以自由的指定用户配置。

     

    所以,不应当在代码中直接import conf来使用配置文件。上面目录结构中的conf.py,是给出的一个配置样例,不是在写死在程序中直接引用的配置文件。可以通过给main.py启动参数指定配置路径的方式来让程序读取配置内容。当然,这里的conf.py你可以换个类似的名字,比如settings.py。或者你也可以使用其他格式的内容来编写配置文件,比如settings.yaml之类的。

     

     


     

    相对路径的调用方法:

    print(__file__)返回的是相对路径(在pycharm里是绝对路径)

    import os

    print(os.path.abspath(__file__))

    用dirname()取其上一级目录,便于调用其他目录下的模块

    具体的:

    import os
    import sys

    print(os.path.abspath(__file__))
    print(os.path.dirname(os.path.abspath(__file__)))
    #base_dir = os.path.dirname(os.path.abspath(__file__))
    print(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))

    #sys.path.append(base_dir) #append把base_dir添加到环境变量
    #import test   #day8目录下有test模块

    结果:

    C:UsersAdministratorPycharmProjectspython项目1day8目录.py
    C:UsersAdministratorPycharmProjectspython项目1day8
    C:UsersAdministratorPycharmProjectspython项目1

    添加完环境变量(一个目录)后在调用模块格式:
    from day7 import test

    ---First
        ---second1
          ---模块1
          ---模块2
        ---second2
          ---模块1
          ---模块2
    在模块1里写下上述程序,dirname()一次就是到了second1这一级别,添加环境变量后就可以
    from second2 import 模块2
    即:实现了从second1下的模块1里调用不同目录second2下的模块2  
    
    





     

  • 相关阅读:
    HDU 4348 To the moon(可持久化线段树)
    HDU 5875 Function 大连网络赛 线段树
    HDU 5877 2016大连网络赛 Weak Pair(树状数组,线段树,动态开点,启发式合并,可持久化线段树)
    HDU 5876 大连网络赛 Sparse Graph
    HDU 5701 中位数计数 百度之星初赛
    CodeForces 708B Recover the String
    Java实现 蓝桥杯 算法提高 套正方形(暴力)
    ASP.NET生成验证码
    ASP.NET生成验证码
    ASP.NET生成验证码
  • 原文地址:https://www.cnblogs.com/gilgamesh-hjb/p/7248566.html
Copyright © 2011-2022 走看看