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),依输入数据的大小而呈指数成长(即输入数据的数量依线性成长,所花的时间将会以指数成长)
常数时间
若对于一个算法,的上界与输入大小无关,则称其具有常数时间,记作时间。一个例子是访问数组中的单个元素,因为访问它只需要一条指令。
对数时间
若算法的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
这个时候要调用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所指向的文件或者目录的最后修改时间
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 + 购物商城程序
- 额度 15000或自定义
- 实现购物商城,买东西加入 购物车,调用信用卡接口结账
- 可以提现,手续费5%
- 每月22号出账单,每月10号为还款日,过期未还,按欠款总额 万分之5 每日计息
- 支持多账户登录
- 支持账户间转账
- 记录每月日常消费流水
- 提供还款接口
- ATM记录操作日志
- 提供管理接口,包括添加账户、用户额度,冻结账户等。。。