简体中文
cover

根据教学反馈和之前我踩过的坑,精心整理的目前为止你们会遇到的 20 道新手 Python 语言问题

1、什么时候加 ""?

一句话,当你想让输出原封不动地打印出来时,你需要加 ""

举个例子:

# 输出 hello world
print("hello world")

# 输出 3 * 5 = 15 其中 15 是 3 * 5 的结果
print("3 * 5 =", 3 * 5)
print(f"3 * 5 = {3 * 5}")

print() 函数接收的参数可以是多个,多个参数之间用 , 分隔。打印的结果会将参数用空格连接起来。

其中 sep 参数可以设置多个参数之间的分隔符,默认为 " "end 参数可以设置整个打印结束后的分隔符,默认为 "\n"

2、input() 函数里写不写提示语句?

不要!因为有些 oj 会根据文本判断来评判你的代码,如果你在 input() 函数里写提示语句,那么提示语句就会输出到控制台,导致 oj 认为你的代码有错误,从而导致你的代码被判为错误。

举个例子:

# 计算两个数的和
# 输入:1 2
# 输出:3
a, b = input().split()
print(int(a) + int(b))

如果你写成 a,b=input("请输入两个数:").split(),那么可能会导致 oj 认为 请输入两个数: 也是输出的内容,从而导致你的代码被判为错误。

3、用 int() 还是 float()?

看题目要求,题目说用什么就用什么。题目中的实数就是浮点数。

4、如何保留 x 位小数?

这属于格式化的问题,使用 f-string 格式化即可。

pi = 3.141592653589793

# 保留 2 位小数
print(f"{pi:.2f}")

# 保留 3 位小数
print(f"{pi:.3f}")

# 保留 4 位小数
print(f"{pi:.4f}")

5、如何同时给多个变量赋值?

= 符号不仅可以赋值给一个变量,还可以赋值给多个变量。

a,b,c=[1,2,3]
print(a,b,c)

或者直接用 , 分割多个值,然后用 = 赋值给多个变量。

a,b,c=1,2,3
print(a,b,c)

6、如何同时输入赋值多个变量?

之前说过 split() 函数是将字符串默认按空格将其分割成一个字符串列表。

比如:

text1='1 2 3'
print(text1.split())

text2='hello world'
print(text2.split())

text3='hello,nihao,welcome'
print(text3.split(","))

所以 input().split() 实际上是将一个字符串列表赋给多个变量。

7、什么时候用类型转换?

在 python 中,接收输入的变量类型是字符串,所以如果你要用数字进行一些运算,那么你需要将字符串转换为数字。

举个例子:

# 输入一个数,输出这个数的平方
a=input()
a=int(a)
print(a**2)

a=input()
print(int(a)**2)

a=int(input())
print(a**2)

# 输入两个数,输出这两个数的和
a,b=input().split()
a=int(a)
b=int(b)
print(a+b)

a,b=map(int,input().split())
print(a+b)

这里的 map() 函数的说明文档如下:

mpa函数

8、map() 函数怎么用?

map() 函数的参数是两个,第一个参数是函数,第二个参数是可迭代对象。

比如:

# 接收多个变量的输入赋值并转换为数字
a,b=map(int,input().split())
print(a+b)

# 接收多个变量的输入并转换为绝对值
a, b = map(abs, map(int, input().split()))
print(a , b)

9、整数计算为什么是小数?

在 python 中,整数的除法结果是浮点数。

a,b=10,5
print(a+b)      # 15
print(a-b)      # 5
print(a*b)      # 50
print(a/b)      # 2.0
print(a//b)     # 2
print(a%b)      # 0

这是 python 的特性,在其他语言中,计算 5 / 2 的结果是 2。而 python 中,为了避免整数除法的结果被截断,从而减少数据丢失

C 语言整数除法

所以 python 为了和其他语言尽量保持相同的功能,于是便有了 // 运算符,它可以实现整数除法。

10、如何提取一个数的每一位?

这种叫拆位运算。

  1. 取个位:直接 %10 来算
  2. 去掉最后一位: //10
  3. 去掉最后两位: //100

举个例子:

# 倒叙输出一个 4 位数(每一位都不为 0)

num=int(input())

a=num//1000
b=num//100%10
c=num//10%10
d=num%10

print(d*1000+c*100+b*10+a)

11、有哪些好用的内置数学函数?

  1. abs() 函数:返回一个数的绝对值
print(abs(-10)) # 10
  1. pow() 函数:返回一个数的幂
print(pow(2,3)) # 8
  1. round() 函数:返回一个数的四舍五入值
print(round(5.5)) # 6
  1. max() 函数:返回一个数的最大值
print(max(1,2,3,4,5)) # 5
  1. min() 函数:返回一个数的最小值
print(min(1,2,3,4,5)) # 1
  1. sum() 函数:返回一个数的和
print(sum([1,2,3,4,5])) # 15
  1. sorted() 函数:返回一个排序后的列表
print(sorted([1,21,3,4333,5])) # [1, 3, 5, 21, 4333]

12、如何处理若干个数据?

输入若干个整数,输出这些整数的和

由于不知道有多少个数据,所以不能用循环来处理

在 python 中,我们可以用 list() 函数来处理。

# 输入若干个整数,输出这些整数的和
a=list(map(int,input().split()))
print(sum(a))

其中的 map 函数功能是将一个字符串列表转换成一个整数列表的映射,然后 list 函数将这个映射转换成一个列表。

13、迭代的思想-斐波那契?

现定义斐波那契数列,其前两项为 F1=1F_1=1F2=1F_2=1,对于 n>=3n>=3Fn=Fn1+Fn2F_n=F_{n-1}+F_{n-2}

则数列的前几项为:1,1,2,3,5,8

求斐波那契数列的第 n 项是多少?

# 输入一个数,输出斐波那契数列的第 n 项
n=int(input())

a,b=1,1

for i in range(n-1):
    next  = a+b   # 新的 F(k+1)
    prev  = a     # 旧的 F(k)
    a = next
    b = prev
print(b)

循环开始前:

a=f(2)=1,b=f(1)=1

每次循环把 (a,b) 滚动成 “下一项” 与 “前一项”:

轮次a (F(k+1))b (F(k))
初值1 (F2)1 (F1)
12 (F3)1 (F2)
23 (F4)2 (F3)
35 (F5)3 (F4)
48 (F6)5 (F5)

14、如何判断一个数是否为闰年?

闰年的判断标准是:

  1. 能被 4 整除,但不能被 100 整除
  2. 能被 400 整除

举个例子:

# 输入一个数,判断这个数是否为闰年
a=int(input())
if a%4==0 and a%100!=0 or a%400==0:
    print("闰年")
else:
    print("平年")

15、如何接收 T 组输入?

平时的程序运行后输入输出就结束进程了,但是我们一般会遇到让用户输入 T 组数据,然后我们对这 T 组数据进行处理。

在 python 中,我们可以用 for 循环来处理 T 组数据。

举个例子:

# 先输入一个整数 T,表示有 T 组数据
# 之后 T 行中每行有 2 个整数
# 每一行输出该组数据的和

T=int(input())

for i in range(T):
    a,b=map(int,input().split())
    print(a+b)

或者还可以这样

T=int(input())

while T > 0:
    T = T - 1
    a,b=map(int,input().split())
    print(a+b)

16、当 xxx 后停止输入?

可能还会遇到:当且仅当 a=0 且 b=0 时,输入结束,该组数据不处理。

举个例子:

# 输入两个数,当且仅当 a=0 且 b=0 时,输入结束,该组数据不处理

while True:
    a,b=map(int,input().split())
    if a==0 and b==0:
        break
    print(a+b)

17、break 和 continue 怎么用?

break 语句用于跳出循环,而 continue 语句用于跳过当前循环的剩余部分,继续下一次循环。

举个例子:

# 输入一个数,如果输入的数是 0,则跳出循环
while True:
    a=int(input())
    if a==0:
        break
    print(a)

再举个例子:

# 输入一个数,如果输入的数是 0,则跳过当前循环的剩余部分,继续下个循环
while True:
    a=int(input())
    if a==0:
        continue
    print(a)

18、for-else 循环怎么用?

for-else 循环是 for 循环的扩展,当 for 循环正常结束时,会执行 else 块中的代码。

举个例子:

# 输出 100 以内的质数

for i in range(2,100):
    for j in range(2,i):
        if i%j==0:
            break
    else:
        print(i)

但凡遍历到了一个因子,就跳出循环,且由于循环没有正常结束,所以不会执行 else 块中的代码。

19、如何判断一个数是否为质数?

质数的定义:大于 1 且仅能被 1 和自身整除的正整数。

举个例子:

# 给定 T 个正整数 n,判断每个 n 是否为素数。
T = int(input())

for _ in range(T):
    num = int(input())
    if num < 2:
        print("No")
        continue
    for i in range(2, num):
        if num % i == 0:
            print("No")
            break
    else:
        print("Yes")

但凡遍历到了一个因子,就打印 No 然后再跳出循环,且由于循环没有正常结束,所以不会执行 else 块中的代码。

20、有没有感觉你的代码很低效?

拿 18 题来说,有必要写 for i in range(2, num) 吗?

如果 num 是一个很大的数,岂不是要从 2 开始遍历到 num,每个数运算一次看看是否能被 num 整除,这样的话效率会很低。

为什么慢:假设 num = 1 000 000 000(一个 10 亿级的素数),就会将近循环 10 亿次,效率会很低。

实际上,我们只需要这么写就可以快上万倍:for i in range(2, int(num**0.5) + 1):

如果 num 是 1 000 000 000,那么 int(num**0.5) + 1 的结果是 31624,也就是我们只需要遍历到 31624 就可以了。足足快了 3 万倍。

为什么呢?

因为一个数的因子是成对出现的,假设 num 不是质数,那么它一定可以写成两个因子相乘的形式:num=abnum=a*b

其中 a<=ba<=b,那么有 a2<=ab<=b2a^2<=a*b<=b^2 ,而 ab=numa*b=num,所以 a2<=num<=b2a^2<=num<=b^2,那么 a<=sqrt(num)a<=sqrt(num),因此只需要遍历到 sqrt(num)sqrt(num) 就可以了。

最后的 +1 因为 range() 函数的参数是左闭右开的,所以要 +1。

0
0
0
0