11月03日(第5天_斐波那契数列、括号配对、二分查找法、关键字参数和非关键字参数)

本文涵盖斐波那契数列生成、括号匹配验证及二分查找算法实现,并介绍列表与字典操作技巧,适合初学者理解核心编程概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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']
平均年龄124.5
平均年龄224.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']]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值