@[TOC](2.25学堂在线python学习笔记 高阶编程)
# 高阶编程
1. 利用二分法查找一个字符是否在某个字符串当中
基线条件:
当s=''时,返回False
当len(s)=1 且 s==char 时返回True
当len(s)>1 且 s[mid]>char时,返回 isIn(char,s[:mid])
否则 当s[mid]<char时,返回isIn(char,s[mid+1:])
若 s[mid]==char 返回True
```py
def isIn(char,s):
'''
char:a single character
s:an alphatical ordered string
'''
if s=='' or len(s)==1:
print(s)
return s==char
mid=int(len(s)/2)
if len(s)>1:
if s[mid]>char:
print(s)
return isIn(char,s[:mid])
elif s[mid]<char:
print(s)
return isIn(char,s[mid+1:])
else:
print(s)
return True
```
2. 检测两个字符串是否相互为回文结构
注意要检测基线条件,两个字符串不能是单字符
```py
def semordnilap(str1,str2):
'''
str1:输入的第一个字符串
str2:输入的第二个字符串
这个函数能够比较并且判别两个字符串
是否相互为回文结构,并且排除不满足条件的情况
'''
def check(str1,str2):
if len(str1)!=len(str2) or len(str1)==1:
return False
else:
return True
#在这里先对输入的字符串检测
#1.是否是单字符,不满足条件
#2.是否两字符串不等长,不满足条件
def ss(str1,str2):
if len(str1)==1:
return True
s1=str1[0]
s2=str2[-1]
if s1==s2:
return ss(str1[1:],str2[:-1])
else:
return False
if check(str1,str2)==True:
return ss(str1,str2)
else:
return 'Wrong form!'
#In [42]: semordnilap('abcd','dbcaa')
#Out[42]: 'Wrong form!'
#不等长
#In [43]: semordnilap('a','a')
#Out[43]: 'Wrong form!'
#单字符
#In [44]: semordnilap('abc','cba')
#Out[44]: True
#成功
```
## 笔记
## 字典型变量
1. 过程映射 map
map(abs,[1,-2,3,-4])
将abs作用到每个元素上
把函数当成一级对象对待我们就可以用的更多
2. 相较于数据结构更加一般化
有了字典我们就有获得字典元素的途径,元素是不可变的。
字典就是纯纯的键和数值的集合
monthNumbers={'jan':1,'feb':2,'mar':3,1:'jan',2:'feb',3:'mar'}
注意,放在冒号:前面的是键,冒号后面是对应的值
3. 提取数据 monthNumber['jan']
4. monthNumebers[2]
5. 很像列表,只不过字典可以是任何元素
6. 字典仅能通过键来访问,因为没有次序,所以不能通过次序来访问(我们刚才看起来是123的次序,但是是人工给的键值)
7. 例如monthNumbers[0]就会出错
8. monthNumbers['Apr']=4就将值4赋予了键'Apr'
9. 我们可以看到,对字典进行遍历,仅仅取到了键,没有取到值
```py
collect=[]
for e in m:
collect.append(e)
#我们可以看到,对字典进行遍历,仅仅取到了键,没有取到值
```
这个例子的意义在于,字典能够被迭代
10. 键可以相当复杂,可以是元组,但是键必须是不可变的,例如列表就是可变的不能用作键!
# 调试debugging
## 重要概念
1. 测试方法
以例子测试代码来判断代码是否正确运行
2. 调试方法
修正程序的方法
3. 什么时候调试检错
3.1我们设计部件的时候都要设计好一块一块的,这样方便锁定错误的发生位置
3.2写好注释,能够帮助调试的时候理解自己当初写的代码,方便找错。
3.3在编程序前,先想好,我的输入是什么,输出是什么,这样能够帮助我们锁定好输入输出,减少错误
3.4良好的注释必须要提示好的假设条件
4. 测试
4.1消除语法错误
4.2消除静态语义错误
4.3设计好,我们希望的输入输出定义
5. 测试的目标:证明bug存在
5.1也可以证明代码没有bug,但是这样很难做,因为我们没办法检测每个输入来测试!
5.2有些方法能够帮助我们证明没有错误,但是通常只能针对简单的代码检测完美无错!
6. 测试集
我们找到一组输入,这组输入很可能能够导致bug,并且很有效。如此来测试代码是否正常运行
(视频6:25)