文档结构练习题练习题1、使用一行代码实现给定列表的奇偶数分离list_a [11, 22, 45,17,19,21,76,34,28,59]答案此处使用 列表推导式实现list_a[11,22,45,17,19,21,76,34,28,59]part_js,part_os[xforxinlist_aifx%21],[xforxinlist_aifx%20]part_js[11,45,17,19,21,59]part_os[22,76,34,28]2、编写程序输出给定范围序列内的所有质数答案此处使用 lamda表达式all()函数以及 filter 函数实现start_nint(input(请输入序列起始值))end_nint(input(请输入序列终止值))iter_rtfilter(lambdax:all(x%y!0foryinrange(2,x)),range(start_n,end_n))list_rtlist(iter_rt)print(list_rt)# 结果输出请输入序列起始值20请输入序列终止值70[23,29,31,37,41,43,47,53,59,61,67]Process finishedwithexit code0此处也可以使用常规的循环方式实现start_n20stop_n70list_rtlist()forxinrange(start_n,stop_n1):loop_flagTrueforyinrange(2,int(x/2)1):ifx%y0:loop_flagFalse# 当该整数可以被别的数整除时确定不是质数breakifloop_flag:# 如果循环完确定该数据是质数则将该数据加入到列表里list_rt.append(x)# 打印质数集合print(list_rt)3、编写程序输出前10个斐波那契数列答案此处使用列表推导式实现fibo[0,1][fibo.append(fibo[-2]fibo[-1])foriinrange(0,8)]print(fibo)# 结果输出[0,1,1,2,3,5,8,13,21,34]Process finishedwithexit code0扩展该题也可以考虑使用递归函数来实现参数支持2种类型一种按照序列数来输入一种按照阈值范围来确定实现按照递归函数和参数名称来赋值# codingutf-8fibo[0,1]defqueryFibo(count0,stop_n0):ifcount:iflen(fibo)count:fibo.append(fibo[-2]fibo[-1])returnqueryFibo(countcount)else:returnfiboelifstop_n:if(fibo[-2]fibo[-1])stop_n:fibo.append(fibo[-2]fibo[-1])returnqueryFibo(stop_nstop_n)else:returnfibo queryFibo(count11)print(fibo)queryFibo(stop_n60)print(fibo)# 输出结果[0,1,1,2,3,5,8,13,21,34,55][0,1,1,2,3,5,8,13,21,34,55]Process finishedwithexit code04、编写程序判断一个数字是否为阿姆斯特朗数(Armstrong)说明如果一个n位正整数等于其各位数字的n次方之和,则称该数为阿姆斯特朗数如下所示扩展此处可以编码实现输出前固定项的Armstrong 或者在某个范围内符合Armstrong特征的值A定义函数selectArmstrong 实现 Armstrong 值的判断defselectArmstrong(input_n:int)-bool:len_nlen(str(input_n))split_n[int(x)**len_nforxinstr(input_n)]sum_nsum(split_n)returnTrueifinput_nsum_nelseFalse说明这里使用到了列表推导式、三元表达式、列表求和操作B定义函数 getArmstrong 获取 Armstrong值要不输入最大边界值要不输入符合的数据项个数defgetArmstrong(count0,start_n1,stop_n1):ifcount1andlen(list_rt)count:ifselectArmstrong(start_n):list_rt.append(start_n)returngetArmstrong(start_nstart_n1,countcount)elifstart_nstop_n:ifselectArmstrong(start_n):list_rt.append(start_n)returngetArmstrong(start_nstart_n1,stop_nstop_n)说明此处使用递归函数计算符合特殊的数值C定义结果列表和 输出逻辑list_rtlist()getArmstrong(count12)print(list_rt)# 输出结果[1,2,3,4,5,6,7,8,9,153,370,371]Process finishedwithexit code0方法二使用列表推导式实现selectArmstrong函数公用list_rtlist()start_n,stop_n11,390[list_rt.append(x)forxinrange(start_n,stop_n)ifselectArmstrong(x)]print(list_rt)# 结果输出[153,370,371]Process finishedwithexit code05、编码实现一行代码展开列表 [[“aa”, “bb”], [“cc”, “dd”], [“ee”, “ff”]]得到新的列表 [‘aa’, ‘bb’, ‘cc’, ‘dd’, ‘ee’, ‘ff’]答案列表推导式实现nest_list[[aa,bb],[cc,dd],[ee,ff]]list_r[yforxinnest_listforyinx]print(list_r)6、编码实现 str_a “ajldjlajfdljfddd”去重并从小到大排序输出adfjl答案先将字符串转换为集合在转换为列表最好排序str_aajldjlajfdljfdddlist_alist(set(str_a))print(list_a)list_a.sort()## 该函数不返回任何值直接修改源列表的元素顺序print(list_a)list_b.join(list_a)print(list_b)说明list.sort() 函数没有返回值所以不能直接将其赋值给另外一个变量7、编码实现 字典 dict_a{“name”:“zs”,“age”:18,“city”:“深圳”,“tel”:“1362626627”} 根据键从小到大排序?方式A取出键值排序后赋值给新的字典dict_a{name:zs,age:18,city:深圳,tel:1362626627}dict_new{}list_alist(dict.keys())list_a.sort(reverseFalse)forxinlist_a:...dict_new[x]dict[x]...dict_new{age:18,city:深圳,name:zs,tel:1362626627}方式B使用内置函数排序生成新的列表dict_a{name:zs,age:18,city:深圳,tel:1362626627}dict_b{}list_bsorted(dict_a.items(),keylambdai:i[0],reverseFalse)list_b[(age,18),(city,深圳),(name,zs),(tel,1362626627)]foryinlist_b:...dict_b[y[0]]y[1]...dict_b{age:18,city:深圳,name:zs,tel:1362626627}8、编码 list[2,3,5,4,9,6]从小到大排序不许用sort输出[2,3,4,5,6,9]实现逻辑递归将原列表最小值赋值给新列表list_aa[22,11,33,55,22,77,99,88]list_ll[]defsortList(var:list):iflen(var)0:min_nmin(var)list_ll.append(min_n)var.remove(min_n)sortList(var)returnlist_llprint(sortList(list_aa))写法二按照 for 循环list_a[99,11,23,15,27,38,57]defsortList(l_input:list):list_blist()iflen(l_input)0:returnNoneforxinrange(0,len(l_input)):list_minmin(l_input)list_b.append(list_min)l_input.remove(list_min)returnlist_bprint(sortList(list_a))方式三冒泡排序list_a[11,22,45,17,19,21,76,34,28,59]forxinrange(0,len(list_a)):foryinrange(x1,len(list_a)):iflist_a[y]list_a[x]:templist_a[x]list_a[x]list_a[y]list_a[y]tempprint(list_a)说明该方式中循环比较元素第一个和后面所有元素的大小将最小的挪到第一个位置9、代码举例说明如何交换两个数值代码实现num_1,num_211,22print(num_1,num_2)1122num_1,num_2num_2,num_1print(num_1,num_2)221110、代码举例说明如何实现列表去重实现方式先转为集合再转为列表代码如下list_a[aaa,bbb,aaa,11,22,33,33]set_aset(list_a)print(set_a){33,11,22,aaa,bbb}list_blist(set_a)print(list_b)[33,11,22,aaa,bbb]11、字符串a “not 404 found 张三 99 深圳”每个词中间是空格用正则过滤掉英文和数字最终输出张三 深圳?在这里插入代码片12、x“abc”,y“def”,z[“d”,“e”,“f”],分别求出x.join(y)和x.join(z)返回的结果代码实现在这里插入代码片13、编码实现 n 的阶乘for 循环defgetfactor(stop_n):curr_v1forxinrange(1,stop_n1):curr_v*xreturncurr_vwhile 循环defgetFactor(stopNum:int):start1result1whilestartstopNum:result*start start1returnresultprint(getFactor(5))递归方式说明递归方式有递归深度限制defgetfactor(stop_n):ifstop_n1:return1elifstop_n1:returnstop_n*getfactor(stop_nstop_n-1)defgetFactor(stopNum:int):start1result1ifstopNumstart:returnstopNum*getFactor(stopNum-1)else:returnresultprint(getFactor(4))14、编码实现 1! 2! 3! …n! 之和实现A递归计算此处复用阶乘函数 getfactordefsumfactor(stop_n):ifstop_n1:return1elifstop_n1:returngetfactor(stop_n)sumfactor(stop_n-1)实现B循环实现defsumfactor(stop_n:int):sum_v,curr_v0,1ifstop_n1:sum_v1elifstop_n1:forxinrange(1,stop_n1):curr_v*x sum_vcurr_vreturnsum_v说明这种实现方式代码简单而且就有些优雅了15、编码计算2个数的最大公约数和最小公共倍数答案在这里插入代码片16、编写函数判断输入的年份是否为闰年说明闰年的判断规则为 非100倍数的年份可以被4整除100倍数的年份可以被400整除defselectLeapYear(year_v:int):if(year_v%40andyear_v%100!0)or(year_v%4000):returnTrueelse:returnFalse17、编码实现键盘输入的值进行因式分解如 120 2* 2* 235 分析进行分解时当除数 大于 被除数的一半时无需再进行分解t120i2list_rtlist()whileTrue:ifi(t/2):list_rt.append(t)breakift%i0:list_rt.append(i)t/ielse:i1print(ft{t},i{i})print(list_rt)18、编码求解假设有一对兔子从出生后第3个月起每个月都生一对兔子小兔子长到第三个月后每个月又生一对兔子假如兔子都不死问每个月的兔子总数为多少分析列出每个月的兔子数值发现类似于斐波那契数列1,1,2,3,5,8,13,21…list_rt[1,1]defgetfibo(month_n:int):ifmonth_n2:returnlist_rt[month_n-1]eliflen(list_rt)month_n:returnlist_rt[-1]else:list_rt.append(list_rt[-2]list_rt[-1])returngetfibo(month_n)19、编码计算一球从100米高度自由落下每次落地后反跳回原高度的一半再落下求它在第10次落地时共经过多少米第10次反弹多高分析# codingutf-8deftotalPath(level):sum_v100curr_l100iflevel1:returnsum_v,curr_l/2else:forxinrange(2,level1):sum_vcurr_l curr_l/2returnsum_v,curr_l/2print(totalPath(4))