面试题-Python-001

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

 

posted @ 2019-04-12 15:18  云卷云舒59  阅读(333)  评论(0编辑  收藏  举报