Python学习第五天

冒泡排序:

将一个不规则的数组按从小到大的顺序进行排序,

1 data=[2,2,7,8,40,12,43,55,10]
2 for j in range(1,len(data)):
3     for i in range(len(data)-j):
4         if data[i]>data[i+1]:
5             tmp=data[i+1]
6             data[i+1]=data[i]
7             data[i]=tmp
8 print(data)

这里需要注意的是第3行,也可以写成 

1  for i in range(len(data)-1):

但是,这个时候程序的效率没有-j的好。

时间复杂度介绍:

(1)时间频度:一个算法花费的时间与算法中语句的执行次数成正比例,哪个算法中语句执行次数多,它花费时间就多。一个算法中的语句执行次数称为语句频度或时间频度。记为   T(n)。

(2)在刚才提到的时间频度中,n称为问题的规模,当n不断变化时,时间频度T(n)也会不断变化。但有时我们想知道它变化时呈现什么规律。为此,我们引入时间复杂度概念。 一般 情况下,算法中基本操作重复执行的次数是问题规模n的某个函数,用T(n)表示,若有某个辅助函数f(n),使得当n趋近于无穷大时,T(n)/f(n)的极限值为不等于零的常数,则称f(n)     是T(n)的同数量级函数。记作T(n)=O(f(n)),O(f(n)) 为算法的渐进时间复杂度,简称时间复杂度。

指数时间

指的是一个问题求解所需要的计算时间o(n),依输入数据的大小n而呈指数成长(即输入数据的数量依线性成长,所花的时间将会以指数成长)

常数时间

若对于一个算法,T(n)的上界与输入大小无关,则称其具有常数时间,记作O(1)时间。一个例子是访问数组中的单个元素,因为访问它只需要一条指令

对数时间

若算法的T(n) = O(log n),则称其具有对数时间。

常见的具有对数时间的算法有二叉树的相关操作和二分搜索

对数时间的算法是非常有效的,因为每增加一个输入,其所需要的额外计算时间会变小。

递归地将字符串砍半并且输出是这个类别函数的一个简单例子。它需要O(log n)的时间因为每次输出之前我们都将字符串砍半。 这意味着,如果我们想增加输出的次数,我们需要将字符串长度加倍。

线性时间

如果一个算法的时间复杂度为O(n),则称这个算法具有线性时间,或O(n)时间。非正式地说,这意味着对于足够大的输入,运行时间增加的大小与输入成线性关系。例如,一个计算列表所有元素的和的程序,需要的时间与列表的长度成正比。

模块介绍:

模块,用一堆代码实现了某个功能的代码集合。 

类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合。而对于一个复杂的功能来说,可能需要多个函数才能完成(函数又可以在不同的.py文件中),n个 .py 文件组成的代码集合就称为模块。

如:os 是系统相关的模块

  • 开源模块

一、开源模块的下载和安装:

下载安装有两种方式:

1 yum 
2 pip
3 apt-get
4 ...
方式一
1 下载源码
2 解压源码
3 进入目录
4 编译源码    python setup.py build
5 安装源码    python setup.py install
方式二

注:在使用源码安装时,需要使用到gcc编译和python开发环境,所以,需要先执行:

1 yum install gcc
2 yum install python-devel
3 4 apt-get python-dev

安装成功后,模块会自动安装到 sys.path 中的某个目录中,如:

1 /usr/lib/python3.0/site-packages/

二、导入模块

Python之所以应用越来越广泛,在一定程度上也依赖于其为程序员提供了大量的模块以供使用,如果想要使用模块,则需要导入。导入模块有一下几种方法:

1 import module
2 from module.xx.xx import xx
3 from module.xx.xx import xx as rename  
4 from module.xx.xx import *

导入模块其实就是告诉Python解释器去解释那个py文件

  • 导入一个py文件,解释器解释该py文件
  • 导入一个包,解释器解释该包下的 __init__.py 文件
1 import sys
2 print sys.path
3 
4 ['C:\\Users\\cslooey\\PycharmProjects\\untitled\\day5', 'C:\\Users\\cslooey\\PycharmProjects\\untitled', 'C:\\Users\\cslooey\\AppData\\Local\\Programs\\Python\\Python35-32\\python35.zip', 'C:\\Users\\cslooey\\AppData\\Local\\Programs\\Python\\Python35-32\\DLLs', 'C:\\Users\\cslooey\\AppData\\Local\\Programs\\Python\\Python35-32\\lib', 'C:\\Users\\cslooey\\AppData\\Local\\Programs\\Python\\Python35-32', 'C:\\Users\\cslooey\\AppData\\Local\\Programs\\Python\\Python35-32\\lib\\site-packages']

如果sys.path路径列表没有你想要的路径,可以通过 sys.path.append('路径') 添加。
通过os模块可以获取各种目录,例如:

1 import sys
2 import os
3 
4 pre_path = os.path.abspath('../')
5 sys.path.append(pre_path)
  • 自定义模块

自定义模块小例子:

先建立一个包(dj),在其下建立3个包和1个.py文件:前端(frontend)、后端(backend)、(config),user_main.py。

在后端(backend)下建立2个包:数据库(db)、逻辑(logic)。

在数据库(db)下建立.py文件(sql.api.py),在逻辑(logic)下建立.py文件(handle.py)。

在config包下建立.py文件(settings.py)

如下图所示:

settings.py中的代码:

1 DATABASE={
2     "engine":"mysql",
3     "host":"localhost",
4     "port":3306,
5     "user":"root",
6     "password":"123"
7 }

sql.api.py中的代码为:

 1 from config import settings
 2 def db_auth(configs):
 3     if configs.DATABASE["user"]=='root' and configs.DATABASE["password"]=='123':
 4         print("db authentication passed!")
 5         return True
 6     else:
 7         print("db login error...")
 8 
 9 def select(table,column):
10     if db_auth(settings):
11         if table=='user':
12             user_info={
13                 "001":['alex',22,'engineer'],
14                 "002":['long',22,'chef'],
15                 "003":['jack',22,'13computer']
16             }
17             return user_info
sql.api.py文件中的代码

这个时候要调用settings

1 from config import settings

handle.py文件中的代码:

 1 from backend.db.sql_api import select#这个时候调用sql_api.py中的select
 2 def home():
 3     print("welcome to home page")
 4     q_data=select("user",'ddd')
 5     print("query res:",q_data)
 6 
 7 def movie():
 8   print("welcome to movie page")
 9 
10 def tv():
11     print("welcome to tv page")

user_main.py文件中的代码为:

1 import sys
2 from backend.logic import handle
3 handle.home()

执行user_main.py文件显示:

1 welcome to home page
2 db authentication passed!
3 query res: {'002': ['long', 22, 'chef'], '003': ['jack', 22, '13computer'], '001': ['alex', 22, 'engineer']}

注意:

执行user_main的时候是不会出现错误的,但是在执行sql_api的时候出错了。

原因是:儿子导父亲,这个时候在sql_api.py文件中需要添加代码:

 1 import sys
 2 import os#添加的代码
 3 base_dir=os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))#添加的代码
 4 sys.path.append(base_dir)#添加的代码
 5 from config import settings
 6 def db_auth(configs):
 7     if configs.DATABASE["user"]=='root' and configs.DATABASE["password"]=='123':
 8         print("db authentication passed!")
 9         return True
10     else:
11         print("db login error...")
12 
13 def select(table,column):
14     if db_auth(settings):
15         if table=='user':
16             user_info={
17                 "001":['alex',22,'engineer'],
18                 "002":['long',22,'chef'],
19                 "003":['jack',22,'13computer']
20             }
21             return user_info

这个时候再执行sql_api.py的时候就不会出错了!!!

  • 内置模块

time&datatime模块:

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

  • 时间戳               1970年1月1日之后的秒,即:time.time()
  • 格式化的字符串    2014-11-11 11:11,    即:time.strftime('%Y-%m-%d')
  • 结构化时间          元组包含了:年、日、星期等... time.struct_time    即:time.localtime()
 1 print time.time()
 2 print time.mktime(time.localtime())
 3   
 4 print time.gmtime()    #可加时间戳参数
 5 print time.localtime() #可加时间戳参数
 6 print time.strptime('2014-11-11', '%Y-%m-%d')
 7   
 8 print time.strftime('%Y-%m-%d') #默认当前时间
 9 print time.strftime('%Y-%m-%d',time.localtime()) #默认当前时间
10 print time.asctime()
11 print time.asctime(time.localtime())
12 print time.ctime(time.time())
13   
14 import datetime
15 '''
16 datetime.date:表示日期的类。常用的属性有year, month, day
17 datetime.time:表示时间的类。常用的属性有hour, minute, second, microsecond
18 datetime.datetime:表示日期时间
19 datetime.timedelta:表示时间间隔,即两个时间点之间的长度
20 timedelta([days[, seconds[, microseconds[, milliseconds[, minutes[, hours[, weeks]]]]]]])
21 strftime("%Y-%m-%d")
22 '''
23 import datetime
24 print datetime.datetime.now()
25 print datetime.datetime.now() - datetime.timedelta(days=5)
 1 import time
 2 import datetime
 3  
 4 print(time.clock()) #返回处理器时间,3.3开始已废弃
 5 print(time.process_time()) #返回处理器时间,3.3开始已废弃
 6 print(time.time()) #返回当前系统时间戳
 7 print(time.ctime()) #输出Tue Jan 26 18:23:48 2016 ,当前系统时间
 8 print(time.ctime(time.time()-86640)) #将时间戳转为字符串格式
 9 print(time.gmtime(time.time()-86640)) #将时间戳转换成struct_time格式
10 print(time.localtime(time.time()-86640)) #将时间戳转换成struct_time格式,但返回 的本地时间
11 print(time.mktime(time.localtime())) #与time.localtime()功能相反,将struct_time格式转回成时间戳格式
12 #time.sleep(4) #sleep
13 print(time.strftime("%Y-%m-%d %H:%M:%S",time.gmtime()) ) #将struct_time格式转成指定的字符串格式
14 print(time.strptime("2016-01-28","%Y-%m-%d") ) #将字符串格式转换成struct_time格式
15  
16 #datetime module
17  
18 print(datetime.date.today()) #输出格式 2016-01-26
19 print(datetime.date.fromtimestamp(time.time()-864400) ) #2016-01-16 将时间戳转成日期格式
20 current_time = datetime.datetime.now() #
21 print(current_time) #输出2016-01-26 19:04:30.335935
22 print(current_time.timetuple()) #返回struct_time格式
23  
24 #datetime.replace([year[, month[, day[, hour[, minute[, second[, microsecond[, tzinfo]]]]]]]])
25 print(current_time.replace(2014,9,12)) #输出2014-09-12 19:06:24.074900,返回当前时间,但指定的值将被替换
26  
27 str_to_date = datetime.datetime.strptime("21/11/06 16:30", "%d/%m/%y %H:%M") #将字符串转换成日期格式
28 new_date = datetime.datetime.now() + datetime.timedelta(days=10) #比现在加10天
29 new_date = datetime.datetime.now() + datetime.timedelta(days=-10) #比现在减10天
30 new_date = datetime.datetime.now() + datetime.timedelta(hours=-10) #比现在减10小时
31 new_date = datetime.datetime.now() + datetime.timedelta(seconds=120) #比现在+120s
32 print(new_date)

 

random模块:

随机数

1 import random
2 print random.random()
3 print random.randint(1,2)
4 print random.randrange(1,10)

生成随机验证码(包含字母和数字的)

1 import random
2 check_code=""
3 for i in range(6):
4    current=random.randint(0,9)
5    check_code+=str(current)
6 print(check_code)

os模块:

提供对操作系统进行调用的接口(用于提供系统级别的操作)

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

sys模块:

用于提供对解释器相关的操作

1 sys.argv           命令行参数List,第一个元素是程序本身路径
2 sys.exit(n)        退出程序,正常退出时exit(0)
3 sys.version        获取Python解释程序的版本信息
4 sys.maxint         最大的Int值
5 sys.path           返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值
6 sys.platform       返回操作系统平台名称
7 sys.stdout.write('please:')
8 val = sys.stdin.readline()[:-1]

json&pickle模块:

用于序列化的两个模块

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

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

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

作业:

作业需求:

模拟实现一个ATM + 购物商城程序

  1. 额度 15000或自定义
  2. 实现购物商城,买东西加入 购物车,调用信用卡接口结账
  3. 可以提现,手续费5%
  4. 每月22号出账单,每月10号为还款日,过期未还,按欠款总额 万分之5 每日计息
  5. 支持多账户登录
  6. 支持账户间转账
  7. 记录每月日常消费流水
  8. 提供还款接口
  9. ATM记录操作日志
  10. 提供管理接口,包括添加账户、用户额度,冻结账户等。。。

 

 

 

 

 

posted @ 2016-02-24 16:23  Peony_Y  阅读(212)  评论(0编辑  收藏  举报