023递归:这帮小兔崽子
本帖最后由 摆渡终极鉴黄师 于 2017-8-12 14:37 编辑斐波那契数列(Fibonacci)例如:
def fab(n):
if n < 1:
print('输入错误!')
return -1
if n == 1 or n == 2:
return 1
else:
return fab(n-1) + fab(n-2)
result = fab (20)
if result != -1:
print('总共有%d对小兔崽子诞生!' % result)
=========== RESTART: C:\Users\Administrator\Desktop\新建文本文档 (2).py ===========
总共有6765对小兔崽子诞生!
>>>
024递归:汉诺塔
本帖最后由 摆渡终极鉴黄师 于 2017-8-13 07:18 编辑用递归解决汉诺塔问题,例如
def hanoi(n, x, y, z):
if n == 1:
print(x, '-->', z)
else:
hanoi(n-1, x, z, y)# 将前n-1个盘子从x移动到y上
print(x, '-->', z)# 将最底下的最后一个盘子从x移动到z上
hanoi(n-1, y, x, z)# 将y上的n-1个盘子移动到z上
n = int(input('请输入汉诺塔的层数:'))
hanoi(n, 'X', 'Y', 'Z')
================ RESTART: C:/Users/Administrator/Desktop/3.py ================
请输入汉诺塔的层数:4
X --> Y
X --> Z
Y --> Z
X --> Y
Z --> X
Z --> Y
X --> Y
X --> Z
Y --> Z
Y --> X
Z --> X
Y --> Z
X --> Y
X --> Z
Y --> Z
>>>
025字典:当索引不好用时
本帖最后由 摆渡终极鉴黄师 于 2017-8-14 15:23 编辑字典dict由多个键和多个对应的值共同组成,每一个键值组合 我们称之为 像,Ta的用法,例如
>>> brand = ['农夫山泉', '鱼C工作室']
>>> slogan = ['我们不生产水,我们只是大自然的搬运工', '用编程改变世界']
>>> print('农夫山泉的口号是:', slogan)
农夫山泉的口号是: 我们不生产水,我们只是大自然的搬运工
>>> dict1 = {'农夫山泉':'我们不生产水, 我们只是大自然的搬运工', '鱼C工作室':'用编程改变世界'}
>>> print('鱼C工作室的口号是:', dict1['鱼C工作室'])
鱼C工作室的口号是: 用编程改变世界
>>> dict2 = {1:'one', 2:'two', 3:'three'}
>>> dict2
{1: 'one', 2: 'two', 3: 'three'}
>>> dict2
'two'
>>> dict3 = {}
>>> dict3
{}
>>> help(dict) #可以查询Ta的用法和功能
>>> dict3 = dict((('F', 70), ('i', 105)))
>>> dict3
{'F': 70, 'i': 105}
>>> dict4 = dict(小甲鱼='让编程改变世界', 苍井空='让AV征服所有宅男')
>>> dict4
{'小甲鱼': '让编程改变世界', '苍井空': '让AV征服所有宅男'}
>>>
dict只要构成一种映射关系那就可以了,Ta只有mapping这一个参数
这里的小甲鱼三个字不能加引号,加了后会报错,例如
>>> dict4 = dict('小甲鱼'='让编程改变世界', 苍井空='让AV征服所有宅男')
SyntaxError: keyword can't be an expression
>>> dict4['苍井空'] = '所有AV从业者都要通过学习编程(exm???)来提高职业技能'
>>> dict4
{'小甲鱼': '让编程改变世界', '苍井空': '所有AV从业者都要通过学习编程(exm???)来提高职业技能'}
>>> dict['爱迪生'] = '天才都是99%的汗水+1%灵感,但这1%的灵感远远比99%的汗水更重要'
(原来小甲鱼来到编程的世界是因为去了图书馆看到一个学姐在看C语言的书233,所以说99%的汗水的过程往往会改变一些什么)
026字典:当索引不好用时2(上)
本帖最后由 摆渡终极鉴黄师 于 2017-8-15 18:32 编辑fromkeys方法创建一个方法并返回一个新的字典,Ta有两个参数,第一个参数是s,Ta是字典的键值,第二个参数v是可选的,就是键值对应的值,如果第二个参数不提供的话,Ta默认就是None,例如
>>> dict1 = {}
>>> dict.fromkeys((1, 2, 3))
{1: None, 2: None, 3: None}
>>> dict.fromkeys((1, 2, 3), 'Number')
{1: 'Number', 2: 'Number', 3: 'Number'}
>>> dict1,fromkeys((1, 2, 3), ('one', 'two', 'three'))
{1: ('one', 'two', 'three'), 2: ('one', 'two', 'three'), 3: ('one', 'two', 'three')}
>>> dict1.fromkeys((1, 3), '数字') #Ta不会只修改1和3对应的值,Ta会直接创建一个新的字典
{1: '数字', 3: '数字'}
访问字典的几个方法,分别是keys(), values(), items()
026字典:当索引不好用时2(中)
本帖最后由 摆渡终极鉴黄师 于 2017-8-16 15:50 编辑访问字典的几个方法,分别是keys(), values(), items(),例如
>>> dict1 = dict1.fromkeys(range(32), '赞')
>>> dict1
{0: '赞', 1: '赞', 2: '赞', 3: '赞', 4: '赞', 5: '赞', 6: '赞', 7: '赞', 8: '赞', 9: '赞', 10: '赞', 11: '赞', 12: '赞', 13: '赞', 14: '赞', 15: '赞', 16: '赞', 17: '赞', 18: '赞', 19: '赞', 20: '赞', 21: '赞', 22: '赞', 23: '赞', 24: '赞', 25: '赞', 26: '赞', 27: '赞', 28: '赞', 29: '赞', 30: '赞', 31: '赞'}
>>> for eachKey in dict1.keys():
print(eachKey)
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
>>> for eachValue in dict1.values():
print(eachValue)
赞
赞
赞
赞
赞
赞
赞
赞
赞
赞
赞
赞
赞
赞
赞
赞
赞
赞
赞
赞
赞
赞
赞
赞
赞
赞
赞
赞
赞
赞
赞
赞
>>> for eachItem in dict1.items():
print(eachItem)
(0, '赞')
(1, '赞')
(2, '赞')
(3, '赞')
(4, '赞')
(5, '赞')
(6, '赞')
(7, '赞')
(8, '赞')
(9, '赞')
(10, '赞')
(11, '赞')
(12, '赞')
(13, '赞')
(14, '赞')
(15, '赞')
(16, '赞')
(17, '赞')
(18, '赞')
(19, '赞')
(20, '赞')
(21, '赞')
(22, '赞')
(23, '赞')
(24, '赞')
(25, '赞')
(26, '赞')
(27, '赞')
(28, '赞')
(29, '赞')
(30, '赞')
(31, '赞')
>>>
026字典:当索引不好用时2(下)
本帖最后由 摆渡终极鉴黄师 于 2017-8-17 13:07 编辑(继上一节课)
>>> dict1.get(32, '咩')
'咩'
>>> dict1.get(31, '咩')
'赞'
我们可以用clear方法清空字典
>>> dict1.clear()
>>> dict1
{}
不过也可以直接dict1={},不过这样不严谨,例如
>>> a = {'蛋':'炒饭'}
>>> b = a
>>> b
{'蛋': '炒饭'}
>>> a = {}
>>> a
{}
>>> b
{'蛋': '炒饭'}
原来的字典并没没清空,可以通过b进行访问,所以最好用clear进行清空,例如
>>> a = b
>>> a
{'蛋': '炒饭'}
>>> b
{'蛋': '炒饭'}
>>> a.clear()
>>> a
{}
>>> b
{}
浅拷贝和赋值是不一样的,例如
>>> a = {1:'one', 2:'two', 3:'three'}
>>> b = a.copy() #这个是浅拷贝(因为注释说的就是浅拷贝)
>>> c = a #这个是赋值
>>> c
{1: 'one', 2: 'two', 3: 'three'}
>>> b
{1: 'one', 2: 'two', 3: 'three'}
>>> a
{1: 'one', 2: 'two', 3: 'three'}
>>> id(a)
45781136
>>> id(b)
45781064
>>> id(c)
45781136
>>> c = 'four'
>>> c
{1: 'one', 2: 'two', 3: 'three', 4: 'four'}
>>> b
{1: 'one', 2: 'two', 3: 'three'}
>>> a
{1: 'one', 2: 'two', 3: 'three', 4: 'four'}
>>>
popitem #随机从字典里爬出一个数据
>>> a.popitem()
(3, 'three')
>>>
setdefault #跟get方法有点类似,但是Ta找不到对应的键的情况下Ta会自动进行添加,例如
>>> a.setdefault('小白')
>>> a
{1: 'one', 2: 'two', 3: 'three', 4: 'four', '小白': None}
>>>
当然也可以跟get一样给一个值,例如
>>> a.setdefault(5, 'five')
'five'
>>> a
{1: 'one', 2: 'two', 3: 'three', 4: 'four', '小白': None, 5: 'five'}
>>>
update方法是利用一个字典或映射关系去更新另外一个字典,例如
>>> b = {'大黄':'狗'}
>>> a.update(b)
>>> a
{1: 'one', 2: 'two', 3: 'three', 4: 'four', '小白': None, 5: 'five', '大黄': '狗'}
027集合:在我的世界里,你就是唯一(上)
本帖最后由 摆渡终极鉴黄师 于 2017-8-19 02:10 编辑>>> num = {}
>>> type(num)
<class 'dict'> #字典类型
>>> num2 = {1, 2, 3, 4, 5}
>>> type(num2)
<class 'set'> #花括号并不是字典的特权,Ta变成了集合,在python3里用花括号扩起一堆数字的话呢,这堆数字没有体现映射关系,这堆数字就是一个集合
>>>
027集合:在我的世界里,你就是唯一(中)
本帖最后由 摆渡终极鉴黄师 于 2017-8-21 04:24 编辑那个5可以直接给剔除,灰常方便,例如
>>> set1 = set()
>>> set1
{1, 2, 3, 4, 5}
>>>
>>> num1 =
>>> temp = []
>>> for each in num1:
if each not in temp: #each如果没有在temp里面
temp.append(each) #我们就可以对temp进行追加
>>> temp
#重复的数字就被去除了
>>> num1 = list(set(num1)) #这样可以自动排序,因为使用set这个函数得到的这个集合是无序的
>>> num1
>>>
027集合:在我的世界里,你就是唯一(下)
本帖最后由 摆渡终极鉴黄师 于 2017-8-21 04:30 编辑可以通过in和not in 判断一个元素是否在集合中已经存在
>>> num2 = {1, 2, 3, 4, 5}
>>> 1 in num2
True
>>> '1' in num2
False
>>>
可以通过add加进去元素和remove方法移除元素,例如
>>> num2.add(6)
>>> num2
{1, 2, 3, 4, 5, 6}
>>> num2.remove(5)
>>> num2
{1, 2, 3, 4, 6}
>>>
frozen:冰冻的,冻结的,函数的用法跟这个意思一样,例如
>>> num3 = frozenset()
>>> num3.add(0)
Traceback (most recent call last):
File "<pyshell#10>", line 1, in <module>
num3.add(0)
AttributeError: 'frozenset' object has no attribute 'add'
>>>
028文件:因为懂你,所以永恒(上)
本帖最后由 摆渡终极鉴黄师 于 2017-8-24 03:32 编辑r 以只读的方式打开文件(默认)
w 以写入的方式打开文件,会覆盖已存在的文件
x 如果文件已经存在,使用此模式打开将引发异常
a 以写入模式打开,如果文件存在,则在末尾追加写入
b 以二进制模式打开文件
t 以文本模式打开(默认)
+ 可读写模式(可添加到其他模式中使用)
U 通用换行符支持
028文件:因为懂你,所以永恒(中)
本帖最后由 摆渡终极鉴黄师 于 2017-8-24 03:37 编辑文件对象方法 执行操作
f.close() 关闭文件
f.read(size=-1) 从文件读取size个字符,给为给定size或给定负值的时候,读取剩余的所有字符,然后作为字符串返回
f.readline() 以写入模式打开,如果文件存在,则在末尾追加写入
f.write(str) 将字符串str写入文件
f.writelines(seq) 向文件写入字符串序列seq,seq应该是一个返回字符串的可迭代对象
f.seek(offset,from) 在文件中移动文件指针,从from(0代表文件的起始位置,1代表当前位置,2代表文件末尾)偏移offset个字节
f.tell() 返回当前在文件中的位置
028文件:因为懂你,所以永恒(下)
本帖最后由 摆渡终极鉴黄师 于 2017-8-24 03:47 编辑例如>>> d = open('D:\\1.txt')
>>> d.read()
''
>>>
(笔记略)
029文件:一个任务(上)
本帖最后由 摆渡终极鉴黄师 于 2017-8-27 02:32 编辑任务:将文件(record.txt)中的数据进行分割并按照以下规律保存起来:
-小甲鱼的对话单独保存为boy_*.txt的文件(去掉"小甲鱼:")
-小客服的对话单独保存为boy_*.txt的文件(去掉"小客服:")
-文件中总共有三段对话,分别保存为boy_1.txt, girl_1.txt, boy_2.txt, girl_2.txt, boy_3.txt, girl_3.txt,共6个文件(提示:文件中不同的对话间已经使用“==========”分割)
f = open('record.txt')
for each_line in f:
if each_line[:6] != '======':
# 我们这里进行字符串分割操作
else:
# 文件的分别保存操作
029文件:一个任务(中)
本帖最后由 摆渡终极鉴黄师 于 2017-8-27 02:33 编辑f = open('record.txt')
boy = []
girl = []
for each_line in f:
if each_line[:6] != '======': # 我们这里进行字符串分割操作
(role, line_spoken) = each_line.split(':', 1) # 我们可以根据冒号把一句话拆分成两个部分,我们使用一个列表进行保存
if role == '小甲鱼': # 如果是小甲鱼的话,要放在boy这个列表里
boy.append(line_spoken)
if role == '小客服': # 如果是小客服的话,要放在girl这个列表里
girl.append(line_spoken)
else:
# 文件的分别保存操作
029文件:一个任务(下)
本帖最后由 摆渡终极鉴黄师 于 2017-8-27 02:28 编辑完整源码(日后观看)
def save_file(boy, girl, count):
file_name_boy = 'boy_' + str(count) + '.txt'
file_name_girl = 'girl_' + str(count) + '.txt'
boy_file = open(file_name_boy, 'w')
girl_file = open(file_name_girl, 'w')
boy_file.writelines(boy)
girl_file.writelines(girl)
boy_file.close()
girl_file.close()
def split_file(file_name):
f = open('record.txt')
boy = []
girl = []
count = 1
for each_line in f:
if each_line[:6] != '======':
(role, line_spoken) = each_line.split(':', 1)
if role == '小甲鱼':
boy.append(line_spoken)
if role == '小客服':
girl.append(line_spoken)
else:
save_file(boy, girl, count)
boy = []
girl = []
count += 1
save_file(boy, girl, count)
f.close()
split_file('record.txt')
030文件系统:介绍一个高大上的东西(上)
本帖最后由 摆渡终极鉴黄师 于 2017-8-30 10:15 编辑>>> secret = random.randint(1, 10)
Traceback (most recent call last):
File "<pyshell#0>", line 1, in <module>
secret = random.randint(1, 10)
NameError: name 'random' is not defined
>>> import random #用import导入random模块
>>> secret = random.randint(1, 10)
>>> secret
1
>>>
模块就是可用代码段的打包,没错,模块是一个包含所有你定义的函数和变量的文件,Ta的后缀呢是.py,跟python文件名后缀是一样的,模块可以做到被别的程序所引入,以使用模块中的函数等功能。
OS:Operating System操作系统
我们所知道常用的操作系统底层对于文件系统的访问工作原理是不一样的,因此你可能就要针对不同的系统来考虑使用哪些文件系统模块......这样的做法是非常不友好且麻烦的,因为这样就意味着当你的程序运行环境已改变,你就要相应的去修改大量的代码来应付。例如windows, Mas OS, Linus UNIX等。但是我们的python的特点就显现出来了,我们的python同样的源代码在不同的操作系统都可以实现,所以python是可以跨平台的语言。python作者搞出了的OS模块,Ta可以帮你选择正确的模块并调用,因此不需要关心什么操作系统下使用什么模块
030文件系统:介绍一个高大上的东西(中)
本帖最后由 摆渡终极鉴黄师 于 2017-8-30 10:15 编辑os模块中关于文件/目录常用的函数使用方法
getcwd() 返回当前工作目录,例如
>>> import os
>>> os.getcwd()
'C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python35'
>>> os.chdir('E:\\')
chdir(path) 改变工作目录,例如
>>> os.chdir('C:\\')
>>> os.getcwd()
'C:\\'
lisdir(path='.') 列举指定目录中的文件名('.'表示当前目录,'..'表示上一级目录)
>>> os.listdir('C:\\')
['$360Section', '$RECYCLE.BIN', '0', '360SANDBOX', '360SoftMgrGame', '360用户文件', 'Boot', 'bootmgr', 'Documents and Settings', 'OEMSF', 'PerfLogs', 'Program Files', 'Program Files (x86)', 'ProgramData', 'srldr', 'System Volume Information', 'Users', 'Windows']
mkdir(path) 创建单层目录,如该目录已存在抛出异常,例如
>>> os.mkdir('C:\\A')
>>> os.mkdir('C:\\A\\B')
>>> os.mkdir('C:\\C\\B')
Traceback (most recent call last):
File "<pyshell#8>", line 1, in <module>
os.mkdir('C:\\C\\B')
FileNotFoundError: 系统找不到指定的路径。: 'C:\\C\\B' # 所以说只能创建一层的啦
makedirs(path)递归创建多层目录,如该目录已存在抛出异常,注意:'C:\\a\\b'和'E:\\a\\c'并不会冲突
rmdir(path) # 删除单层目录,如该目录非空则抛出异常
>>> os.rmdir('C:\\C\\B')
Traceback (most recent call last):
File "<pyshell#9>", line 1, in <module>
os.rmdir('C:\\C\\B')
FileNotFoundError: 系统找不到指定的路径。: 'C:\\C\\B' # 所以说要先把目录里的文件清除掉
remove(path) 删除文件
>>> os.remove('C:\\A\\B\\岛国爱情动作教育片磁链.txt')
>>> os.rmdir('C:\\A\\B')
搞定
removedirs(path) 递归删除目录,从子目录到父目录逐层尝试删除,如到目录非空则抛出异常(确保要删除的目录是空的)
rename(old, new) 将文件old重命名为new
system(command) 运行系统的shell命令,例如
>>> os.system('cmd')
-1073741510
>>> os.system('calc') #这样就把计算器打开了
0
os.curdir 指代当前目录('.'),例如
>>> os.curdir
'.'
os.pardir 指代上一级目录('..'),例如
>>> os.listdir(os.curdir)
['$360Section', '$RECYCLE.BIN', '0', '360SANDBOX', '360SoftMgrGame', '360用户文件', 'A', 'Boot', 'bootmgr', 'Documents and Settings', 'OEMSF', 'PerfLogs', 'Program Files', 'Program Files (x86)', 'ProgramData', 'srldr', 'System Volume Information', 'Users', 'Windows']
>>>
os.sep 输入操作系统特定的路径分隔符(Win下为'\\', Linux下为'/')
os.linesep当前平台使用的行终止符(Win下为'\r\n', Linux下为'\n')
os.name 指代当前使用的操作系统(包括:'posxi', 'nt', 'mac', 'os2', 'ce', 'java') # posix是unix系统,nt是windows平台,mac是苹果
030文件系统:介绍一个高大上的东西(emmm)
本帖最后由 摆渡终极鉴黄师 于 2017-8-31 04:15 编辑basename(path) 去掉目录路径,单独返回文件名
dirname(name) 去掉文件名,单独返回目录路径
join(path1[, path2[, ...]]) 将path1, path2各部分组合成一个路径名
split(path) 分割文件名与路径,返回(f_path, f_name)元祖。如果完全使用目录,Ta会将最后一个目录作为文件名分离,且不会判断文件或者目录是否存在
splitext(path) 分离文件名与扩展名,返回(f_name, f_extension)元祖
getsize(file) 返回指定文件的尺寸,单位是字节
getatime(file) 返回指定文件最近的访问时间(浮点型秒数,可用time模块的gmtime()或localtime()函数换算)
getmtime(file) 返回指定文件的创建时间(浮点数秒数,可用time模块的gmtime()或localtime()函数换算)
030文件系统:介绍一个高大上的东西(下)
本帖最后由 摆渡终极鉴黄师 于 2017-9-1 04:51 编辑以下为函数返回True或False
exists(path) 判断指定路径(目录或文件)是否存在
isabs(path) 判断指定路径是否为绝对路径(例如,C:\\test.txt是绝对路径,假设我们在C盘的A文件夹里..\\text.txt就是相对路径)
isdir(path) 判断指定路径是否存在且是一个目录
isfile(path) 判断指定路径是否存在且是一个文件
islink(path) 判断指定路径是否存在且是一个符号链接
ismount(path) 判断指定路径是否存在且是一个挂载点
samefile(path1, path2)判断path1和path2两个路径是否指向同一个文件