python之路-基础篇-第五周

二、排序

1.冒泡排序


#冒泡
data = [10,4,33,21,54,3,8,11,5,22,2,1,17,13,6]

for j in range(1, len(data)):  #range(1,15)

    for i in range(len(data)-j):  #range(15-j)
        if data[i] > data[i+1]:
            tmp = data[i+1]         #交换位置
            data[i+1] = data[i]
            data[i] = tmp
print(data)

2.其他排序

参考这里


三、时间复杂度

算法复杂度有两个要素,时间复杂度和空间复杂度。其中时间复杂度是指算法执行长度的度量,空间复杂度是算法占用内存空间的度量。

参考文件:百度文库-时间频度与时间复杂度这里我们只简单阐述一下时间复杂度。

1.时间频度(语句频度)

T(n)

2.时间复杂度(渐进时间复杂度)

O(f(n)) --其中T(n)/O(f(n))=常数

一般情况下:

O(1)<O(log2n)<O(n)<O(n log2 n)<O(n2)<O(n3)<O(2^n)

所以选择算法复杂度较小的算法。

指数时间:

O(2n)

对数时间:

O(logN)

线性时间:

O(n)

常数时间:

O(1)

平方阶时间(或k次方阶时间)

O(n2)

O(n3)

O(nk)


四、模块

1.模块介绍

1)自定义模块

如何自定义模块?

  • 弄一堆.py文件,按照一定方法分类,形成一个能够对外提供某些功能的东西;

  • 在python3.x中可不在文件夹中增加__init__.py文件,然而在python2.x中必须要有;

自己搞一个模块:

  • 文件结构如下:

jiegou

  • 各文件之间的关系

    • backend文件夹为后台服务相关,包括db和logic两个文件夹,分别处理数据库和逻辑相关的内容。

    • config文件夹为配置相关,有一个setting文件保存配置文件

    • frontend文件夹为前端相关,这里没写内容

    • user_mian.py文件为用户调用,模拟用户操作。

这里用user_mian中简单调用一个backend中logic的handle文件中的一个home函数,而home函数调用sql_api文件模拟获取从数据库中获得文件,但是在登陆数据库时,模拟从config下setting文件中获取用户名和密码。这样就简单实现一个模块中多个py文件之间的相互调用。

  • sql_api.py

from config import setting

def auth(configs):
    if configs.DATABASE["user"] == "root" and configs.DATABASE["password"] == "123123":    #为了方便验证,就直接写死了
        print("welcom login database")
        return True
    else:
        print("error....")


def select(name, age):
    res = auth(setting)

    if res:
        return name,age
  • handle.py

from backend.db import sql_api


def home():
    print("welcome to home page...")
    q_data = sql_api.select("alex", "123")
    print(q_data)


def movie():
    print("welcome to movie page...")
def tv():
    print("welcome to tv page...")
  • setting.py

DATABASE = {
    "user":"root",
    "password":"123123",
    "host":"localhost",
    "port":3306,
}
  • user_main.py

from backend.logic import handle

handle.home()

执行user_mian.py后:


welcome to home page...   #handle中home()函数

welcom login database      #sql_api调用了auth(configs),使用setting中的字典验证数据库登陆

('alex', '123')    #sql_api调用select(name,age)函数

2)标准模块(标准库)

标准库好多,等下写几个刚用的。

3)开源模块:pip下载

在https://pypi.python.org/pypi可以下载开源模块

pypi

如何下载呢?


比如下载xheap 0.6,打开链接,复制链接,使用pip即可。

$pip https://pypi.python.org/pypi/xheap/0.6

2.sys模块


sys.argv           命令行参数List,第一个元素是程序本身路径

sys.exit(n)        退出程序,正常退出时exit(0)

sys.version        获取Python解释程序的版本信息

sys.maxint         最大的Int值

sys.path           返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值

sys.platform       返回操作系统平台名称

sys.stdout.write('please:')    #标准输出文件,可以使用文件的其他操作,如write,flush等

val = sys.stdin.readline()[:-1]  #默认最后会加一个空格,因此去掉

print(val)


#生成简单的进度条,依次显示10个#号

import sys
import time

for i in range(10):
    sys.stdout.write("#")
    sys.stdout.flush()
    time.sleep(0.5)

3.os模块


os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径
os.chdir("dirname")  改变当前脚本工作目录;相当于shell下cd
os.curdir  返回当前目录: ('.')
os.pardir  获取当前目录的父目录字符串名:('..')
os.makedirs('dirname1/dirname2')    可生成多层递归目录
os.removedirs('dirname1')    若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推
os.mkdir('dirname')    生成单级目录;相当于shell中mkdir dirname
os.rmdir('dirname')    删除单级空目录,若目录不为空则无法删除,报错;相当于shell中rmdir dirname
os.listdir('dirname')    列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印
os.remove()  删除一个文件
os.rename("oldname","newname")  重命名文件/目录
os.stat('path/filename')  获取文件/目录信息
os.sep    输出操作系统特定的路径分隔符,win下为"\\",Linux下为"/"
os.linesep    输出当前平台使用的行终止符,win下为"\t\n",Linux下为"\n"
os.pathsep    输出用于分割文件路径的字符串
os.name    输出字符串指示当前使用平台。win->'nt'; Linux->'posix'
os.system("bash command")  运行shell命令,直接显示
os.environ  获取系统环境变量
os.path.abspath(path)  返回path规范化的绝对路径
os.path.split(path)  将path分割成目录和文件名二元组返回
os.path.dirname(path)  返回path的目录。其实就是os.path.split(path)的第一个元素
os.path.basename(path)  返回path最后的文件名。如何path以/或\结尾,那么就会返回空值。即os.path.split(path)的第二个元素
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.join(path1[, path2[, ...]])  将多个路径组合后返回,第一个绝对路径之前的参数将被忽略
os.path.getatime(path)  返回path所指向的文件或者目录的最后存取时间
os.path.getmtime(path)  返回path所指向的文件或者目录的最后修改时间

4.random模块


import random
print(random.random())  #0-1的随机浮点数
print(random.randint(1,2))  #1-2,包括1和2
print(random.randrange(1,10))    #1-10,包括1不包括10

#生成随机验证码,4位验证码

import random
check_words = ''
for i in range(4):
    current = random.randrange(4)
    if check_words != i:
        check_words += str(chr(random.randint(65, 90)))
    else:
        check_words += str(random.randint(0, 9))

print(check_words)

5.time模块和datetime模块


import time
import datetime

print(time.clock()) #返回处理器时间,3.3开始已废弃
print(time.process_time()) #返回处理器时间,3.3开始已废弃
print(time.time()) #返回当前系统时间戳
print(time.ctime()) #输出Tue Jan 26 18:23:48 2016 ,当前系统时间
print(time.ctime(time.time()-86640)) #将时间戳转为字符串格式
print(time.gmtime(time.time()-86640)) #将时间戳转换成struct_time格式
print(time.localtime(time.time()-86640)) #将时间戳转换成struct_time格式,但返回 的本地时间
print(time.mktime(time.localtime())) #与time.localtime()功能相反,将struct_time格式转回成时间戳格式
#time.sleep(4) #sleep
print(time.strftime("%Y-%m-%d %H:%M:%S",time.gmtime()) ) #将struct_time格式转成指定的字符串格式
print(time.strptime("2016-01-28","%Y-%m-%d") ) #将字符串格式转换成struct_time格式

#datetime module

print(datetime.date.today()) #输出格式 2016-01-26
print(datetime.date.fromtimestamp(time.time()-864400) ) #2016-01-16 将时间戳转成日期格式
current_time = datetime.datetime.now() #
print(current_time) #输出2016-01-26 19:04:30.335935
print(current_time.timetuple()) #返回struct_time格式

#datetime.replace([year[, month[, day[, hour[, minute[, second[, microsecond[, tzinfo]]]]]]]])
print(current_time.replace(2014,9,12)) #输出2014-09-12 19:06:24.074900,返回当前时间,但指定的值将被替换

str_to_date = datetime.datetime.strptime("21/11/06 16:30", "%d/%m/%y %H:%M") #将字符串转换成日期格式
new_date = datetime.datetime.now() + datetime.timedelta(days=10) #比现在加10天
new_date = datetime.datetime.now() + datetime.timedelta(days=-10) #比现在减10天
new_date = datetime.datetime.now() + datetime.timedelta(hours=-10) #比现在减10小时
new_date = datetime.datetime.now() + datetime.timedelta(seconds=120) #比现在+120s
print(new_date)




6.json & pickle 模块

用于序列化的两个模块

  • json,用于字符串 和 python数据类型间进行转换,多语言之间通用(如java,C#,python)

  • pickle,用于python特有的类型 和 python的数据类型间进行转换,可是使用的数据类型更多

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

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


#json 写

import json
f = open("data.txt",'w')
dic1 = {
    "name": "alex",
    "age": 12,
    "job": "ITer"
}

# res = json.dumps(dic1)
# f.write(res)
# 等价于
json.dump(dic1, f)

f.close()

#json 读

import json
f = open("data.txt",'r')  #使用字符串写入或读取
#res = json.loads(f.read())
# 等价于
res = json.load(f)
f.close()
print(res)

同样的pickle:


import pickle
f = open("data.txt",'wb')  #注意使用二进制来读写
dic1 = {
    "name": "alex",
    "age": 12,
    "job": "ITer"
}

# res = pickle.dumps(dic1)
# f.write(res)
# 等价于
pickle.dump(dic1, f)

f.close()
import pickle
f = open("data.txt",'rb')  #使用二进制写入或读取
#res = pickle.loads(f.read())
# 等价于
res = pickle.load(f)
f.close()
print(res)




posted @ 2016-01-31 10:25  felo  阅读(326)  评论(0编辑  收藏  举报