Morning
斐波那契数列、括号配对、二分查找法
1. 斐波那契数列。要求输入一个数n,输出斐波那契数列的前n个数。
#斐波那契数列:列表法
num = 1
start = [0,1]
for i in range(0,num-2):
feibonaqie = start[i]+start[i+1]
start.append(feibonaqie)
print(start)
#斐波那契数列:列表推导式错误做法
num = 4
start = [0,1]
[start.extend(start[i]+start[i+1]) for i in range(0,num-2)] #为什么这样不行?
#斐波那契数列:老师的做法
def fib(num):
origion = [0,1]
if num <= 2:
return origion
else:
for i in range(num-2):
origion.append(sum(origion[-1:-3:-1])) #这个语句要留意,学会这种手法
return origion
fib(7)
2. 输入一个字符串‘[[[]]][]’,要求判断这个字符串中的‘[’和‘]’是否完全配对。(此题想考察append和pop函数的使用)
#中括号配对:老师的做法
#想象成只能是男生在左,女生在右的配对游戏
def pairtest(str):
boy = girl = 0
if len(str)%2!=0 or str[0] != '[' or str[-1] != ']': return 'lens error or code error'
for item in str:
if item =='[':
boy += 1
else:
girl += 1
print(boy,girl)
if girl > boy: return False
if boy > girl: return False
return True
string = '[]][[][]'
pairtest(string)
#中括号配对:根据老师的做法引申的
string = '[]][[][]'
if string[0] == ']' or string[-1] == '[' or (string.count(']') != string.count('[')):
print('N')
else:
left = right = 0
for i in range(len(string)):
if string[i] =='[':
left += 1
else:
right += 1
if right > left:
print('N')
break
if right < left:
print('Y')
3. 二分查找法。
numberlist = [3,7,15,22,66,198,200]
def chazhao(num,numberlist):
if num < numberlist[0] or num > numberlist[-1]: return False
halfid = len(numberlist)//2 #3
if num>=numberlist[halfid]:
numberlist = numberlist[halfid:]
else:
numberlist = numberlist[:halfid+1]
if len(numberlist) == 2:
return(numberlist)
else:
return chazhao(num,numberlist)
print(chazhao(45,numberlist))
运行结果:
[22, 66]
Afternoon
字典、关键字参数和非关键字参数
1. 设置一个加法,传入的参数不确定。
#非关键字 传入的参数不止一个
def add(*arg):
sum = 0
for i in arg:
print(i)
sum = sum+i
return sum
add(1,2,9,11)#这里不可以写成add(((1,2,9,11))
运行结果:
1
2
9
11
Out[4]: 23
2. 定义一个函数可以传入不定长的键值对并将其打印出来。
canshu ={'name':'taozi','age':22,'hight':167}
# canshu.items()
def stud(**canshu):
for key in canshu.keys():
print(key,':',canshu[key])
print(key+':'+str(canshu[key]))
# print(key+':'+canshu[key] )#这样就错了,因为它的values里面有数值型
# canshu ={'name':'taozi','age':22,'hight':167} #错误,必须得像下面这行这样赋值
stud(name='taozi',age=22,hight=167)
运行结果:
name : taozi
name:taozi
age : 22
age:22
hight : 167
hight:167
3. 定义一个函数,接收并输出:(1)班级名字;(2)班级特色;(3)每位学员的姓名、年龄(不输出年龄,要输出平均年龄)。
def AI(classname,*features,**member):
print(classname)
print(features)
print([k for k in member])
print('平均年龄1:',sum(member.values())/len(member.values()))
print('平均年龄2:',sum((list(member.values())))/len((list(member.values())))) #刚才核有问题,所以这里加了list
AI('上海AI班','上进','努力',taozi=24,shengnna=25)
运行结果:
上海AI线下班
('上进', '努力')
['taozi', 'shengnna']
平均年龄1: 24.5
平均年龄2: 24.5
4. 参数收集的逆过程*。
def printname(name1,name2,name3,name4):
print(name1,name2,name3,name4)
L1 = ['TZ','MY','SN','YQ']
printname(*L1) #一个星表示传进去的不固定
L2 = ['TZ','MY','SN']
printname(*L2,'YQ')
# L3 = ['TZ','MY','SN']
# printname(*L3) #这样就错了,必须得有4个
运行结果:
TZ MY SN YQ
TZ MY SN YQ
5. 统计三个字符串中每个字母出现的次数。
def sta_str(*arg):
all_str = ''
for item in arg:
all_str += item.lower()
dict = {}
for j in all_str:
dict[j] = all_str.count(j)
return dict
li = ['China','USA','love','Austrulia']
sta_str(*li)
运行结果:
{'a': 4,
'c': 1,
'e': 1,
'h': 1,
'i': 2,
'l': 2,
'n': 1,
'o': 1,
'r': 1,
's': 2,
't': 1,
'u': 3,
'v': 1}
6. 对第5题中的key和value进行反转。
fanzhuan = sta_str(*li)
for k,v in fanzhuan.items():
# print(v,':',k)
zidian[v] = k
print(zidian)
运行结果:
{1: 'r', 2: 'l', 4: 'a', 3: 'u'}
7. 统计三句话中不同单词出现的次数。
- 方法一:列表做法(我自己的做法)
def stra_words(li):
li2 = ' '.join(li)
li3 = li2.split(' ')
dict={}
li4 = [item.lower() for item in li3]
for item in li4:
dict[item]=li4.count(item.lower()) #这样i变成小写之后后面的i并没有变成小写,所以是i统计出来是0
return dict
li = ['I lived in China many years ago','I saw a very big baby','You are a very beautiful']
stra_words(li)
运行结果:
{'a': 2,
'ago': 1,
'are': 1,
'baby': 1,
'beautiful': 1,
'big': 1,
'china': 1,
'i': 2,
'in': 1,
'lived': 1,
'many': 1,
'saw': 1,
'very': 2,
'years': 1,
'you': 1}
- 方法二:老师的做法,用到了参数收集的逆过程:星(*)和双星。
def wordcount(*words):
print(type(words)) #查看传入参数的类型,是个tuple,因为传入时使用*,是被打散的list,而接收也使用了*,所以是个tuple
l1=[]
print([l1.extend(sentence.split()) for sentence in words]) #注意此句
return {word:l1.count(word) for word in l1}
li = ['I lived in China many years ago','I saw a very big baby','You are a very beautiful']
wordcount(*l1)
运行结果:
<class 'tuple'>
[None, None, None]
Out[16]:
{'ago': 1,
'china': 2,
'feel': 1,
'i': 3,
'in': 2,
'lived': 1,
'many': 1,
'saw': 1,
'today': 2,
'very': 1,
'well': 1,
'years': 1,
'you': 1}
PS:append和extend区别:
aList = [123, 'xyz', 'zara', 'abc', 123];
bList = [2009, 'manni'];
aList.extend(bList)
print(aList)
aList = [123, 'xyz', 'zara', 'abc', 123];
bList = [2009, 'manni'];
aList.append(bList)
print(aList)
运行结果:
[123, 'xyz', 'zara', 'abc', 123, 2009, 'manni']
[123, 'xyz', 'zara', 'abc', 123, [2009, 'manni']]