1、 下面的代码,输出结果是什么?
def f(x, I = []): for i in range(x): I.append(i*i) print(I) f(2) f(3, [3, 2, 1]) f(3)
输出结果:
[0, 1]
[3, 2, 1, 0, 1, 4]
[0, 1, 0, 1, 4]
解析:1)该题是函数接收一个数字和数组;
然后做循环,循环开始值0,步长为传入数字;每次循环,都将循环值平方后,追加到数组最后;
循环结束后,输出数组。
2)数组可以不传入,函数默认一个空数组。
但是在 f(2) 后接着执行 f(3) 时,虽然 f(3) 同样未传入数组,但函数未将数组重新初始化,仍然在 f(2) 执行后的数组上继续追加。
我果然没有好好看书,虽然原来的推测不错,但廖雪峰的函数的参数中的默认参数这节中,其实有更准确的说明:
Python函数在定义的时候,默认参数I
的值就被计算出来了,即[]
,因为默认参数I
也是一个变量,它指向对象[]
,
每次调用该函数,如果改变了I
的内容,则下次调用时,默认参数的内容就变了,不再是函数定义时的[]
了。
所以,为了避免这种不确定性,默认参数必须指向 str、None 这样的不变对象!
2、请将一个字符串倒叙输出:
方法一:
a = input('请输入长度20位以内的字符串:') b = '' for i in a: b = i + b print(b)
方法二:
a = input('请输入长度20位以内的字符串:') b = a[::-1] print(b)
解析:1)方法一,利用了python中以下特性:字符串就是一个数组;可以对数组中的元素进行遍历;可以通过“+”直接拼接字符串。
2)方法二,利用了切片功能,实现了字符串倒序。关于切片, [开始位置: 结束位置: 步长] 。(注意:步长为负数时,起止位置最好也用负数。)
3、写一段代码,生成30个随机数,保证30个随机数的和为3200,随机性越强越好。
import random sum = 3200 avg = sum / 30 b = [] for i in range(15): n = int(avg * 2 * random.random()) b.append(n) n = int(avg * 2 - n) b.append(n) b.pop(-1) for i in b: sum -= i b.append(sum) print(b)
解析:1)本代码仅做参考,对题目中“随机性越强越好”的意图不是很理解。
本题没有明确说明数据类型和取值范围,所以假定都必需是大于等于0的正整数。
2)对于(1)中的随机性,我的理解是分布较为平均。所以采取了围绕平均值,两个一对的方式求随机数。
3)因为要满足总和等于3200,且是按取正整数的思路来做随机,为了保证满足总和,从list中移除最后一个随机数,该随机数改为:用3200减去其余29个随机数的总和。
4、求字符串‘welcome to china to study’中‘o’第三次出现时的下标是多少。
方法一:
str1 = 'welcome to china to study' count = 0 l = 0 if count <= 0: print('查询次数必须大于0,否则默认查询次数为1。') count = 1 for i in range(len(str1)): if str1[i] == 'o': l += 1 if l == count: print(i) break if l < count: print('查找字符未出现 %d 次' %count)
方法二:
str2 = 'welcome to china to study' count = 3 beg = 0 if count <= 0: print('查询次数必须大于0,否则默认查询次数为1。') count = 1 for i in range(count): l = str2.find('o', beg) beg = l+1 if (l == -1): break if l < 0: print('查找字符未出现 %d 次'.format(count)) else: print(l)
解析:1)方法一,利用了循环,若满足需要查找的字符时,计数器加1;
因为指定查找第三次出现,所以计数器满足该条件时,输出当前下标,并跳出循环。
2)方法二,利用自带的 find 函数 。
因为该函数可以指定查找的开始、结束位置,所以循环相当于方法一中的计数器。
每次找到符合要求的字符后,则在当前位置加1,作为下一次开始查找的位置。
3)count变量非必需,只是为了方便查找不同次数做了参数化。
针对查找次数为0或超出的情况,做了些预防措施。
5、交换 a, b 两个变量的值
a = 111 b = 222 print(a, b, sep = '\t') a, b = b, a print(a, b, sep = '\t')
解析:1)python中,2个变量值交换的快捷写法:a, b = b, a