Python基础选择题 Zero to Hero
选择题后面给出的解释链接,包括如StackOverflow等知名网站是开始培养良好自学习惯的正路
习惯去这些网站搜索或提问,极有可能找到高手给出专业的解决方法,一旦习惯了英文阅读原文档,必获益无穷!
1、在下面的代码片断中,返回的对象的类型是什么?
def foo(*args):
return args
foo(1, 2, 3)
运行foo返回结果是下面哪一种数据类型,请选择:
a、列表
b、字典
c、元组
2、下面代码的输出结果是?
class Foo(object):
def __init__(self):
self.__method()
def __method(self):
print('42')
class MoreFoo(Foo):
def __method(self):
print('41')
MoreFoo()
a、41
b、42
由于method()是一个私有方法(可以通过双下划线来识别),它不能通过在子类中简单地定义为__method(self)而被重写(以避免意外的重写)。为了强制覆盖,它必须被重新定义为 def _Foo__method(self)。. 这就是所谓的名称混用。
oop - Override a "private" method in Python - Stack Overflow
3、字典可以无限嵌套吗?nested
d = {1: {1:'none'} ...}
Can python list and dictionary be nested infinitely? - Stack Overflow
4、print输出是?
[python - How to print number with commas as thousands separators? - Stack Overflow](https://stackoverflow.com/questions/1823058/how-to-print-number-with-commas-as-thousands-separators)
print(f"{10000000:,}")
0,10000000
10,000,000
10.000.000
10000000,0
10000000.0
5、导入所有的sys库?
import sys
还是:
from sys import argv
以上都是
解释:在上面的例子中,无论使用何种语法,整个模块sys都将被导入。唯一的区别是模块被绑定的名称(即sys或argv)
python - 'import module' vs. 'from module import function' - Software Engineering Stack Exchange.)
6、哪个用法可以正确输出:[1, 2, 3, [4, 5]]
Which code snippet will return [1, 2, 3, [4, 5]]?
x = [1, 2, 3]
x.append([4, 5])
x
or
x = [1, 2, 3]
x.extend([4, 5])
解释:
What is the difference between Python's list methods append and extend? - Stack Overflow
7、
What is the output of the code snippet below?
真还是假?
print(reversed("hello") == "olleh")
True
False
解释:Python reversed() (programiz.com)
8、
What exception will be thrown?
print(t[5])
A NameError exception
A TypeError exception
An IndexError exception
A ValueError exception
9、代码片段运行结果是?
result = 0
def find_sum(num1, num2):
if num1 != num2:
result = num1+num2
else:
result = 2*(num1+num2)
find_sum(3, 4)
print(result)
find_sum(5, 5)
print(result)
a、抛出错误 Valueerror
b、7 20
c、14 10
d、0 0
解释
Python Global Variables (w3schools.com)
10、以下输出结果是什么?
my_set = {1, 'Python', ('John', 'Jeanne'), True}
print(my_set)
解释
PEP 285 – Adding a bool type | peps.python.org
11、float的用法输出是?
What it the output of the code snippet below?
print(float("nan"))
正确的选项是?
0
nan
0.0
NaN
解释:
Built-in Functions — Python 3.10.4 documentation
12、变量的值和
Considering the code snippet below, how many objects and how many references are created?
n = 300
m = n
正确的选项是?
Two objects, two references
One object, one reference
One object, two references
13、位运算
Which bitwise operator gives 1 if one of the bit is 1 and other is 0 else returns False?
正确选项是?
AND
XOR
NOT
OR
解释:
Python Bitwise Operators - GeeksforGeeks
14、random用法
fruit=['apple', 'banana', 'papaya', 'cherry']
正确选项是?
random.shuffle(fruit)
fruit.shuffle()
random.shuffleList(fruit)
shuffle(fruit)
解释:
random — Generate pseudo-random numbers — Python 3.10.4 documentation
15、float
print(float(False))
正确选项是?
It will throw a ValueError error.
0.0
0
False
解释
Built-in Functions — Python 3.10.4 documentation
16、
任何讲多种语言的人都明白,一种语言的规则不一定适用于另一种语言;我的母语是英语,但我也讲特维语,这是加纳阿坎部落的一种方言。只要我在加纳,我就强迫自己说特维语--我犯了很多错误,但当地人很友好,他们会帮助我。
我所犯的错误不一定是会破坏我所说的意思,通常只是特维语的错误练习,他们在说英语时也会经常犯同样类型的错误。例如,加纳人在用特维语交流时,通常会在每句话的开头说请,所以他们在说英语时也会这么做。
虽然 "请是 "不一定是对英语语法的糟糕使用,但你可能不会这么说。但这种错误源于试图将英语的规则应用于特维语。许多用各种语言编码的程序员也陷入了这个陷阱。
你的代码可能不会出错,但当其他程序员试图理解你写的东西时,你会让他们的生活变得更加困难。花点时间了解一种语言的最佳实践,不仅对你自己,而且对其他必须与你合作的人都有好处。出于这个原因,我们将介绍编写Pythonic代码的五种标准方法。
1、 enumerate()而不是range()
names = ["john", "doe", "jane", "plane"]
for idx in range(len(names)):
print(idx, names[idx])0 john
1 doe
2 jane
3 plane
你会发现上面的代码是有效的,可以正常运行,那么为什么会有这样的问题呢?它违背了使 Python 成为如此成功的编程语言的原因之一:可读性。
使用range(len(names))约定很容易做到,但不太理想,因为它损害了可读性。执行相同功能的更好方法是将列表传递给内置的 enumerate() 函数,它将返回索引和序列中元素的整数。
names = ["john", "doe", "jane", "plane"]
for name in names:
print(name)john
doe
jane
plane
2、 使用with
语句
你可能正在编写一个需要你读取或写入文件的程序。open()和close()内置函数允许开发者分别打开和关闭文件。
requirements = open("requirements.txt", "w")
requirements.write(
"scikit-learn >= 0.24.2, < 0.25.0",
"numpy >= 1.21.2, < 1.22.0",
"pandas >= 1.3.3, < 1.4.0"
)
requirements.close()
在上面的代码中,我们打开了一个叫做requirements.txt的文本文件,写了一些内容,然后完成后关闭了它。这段代码是完全有效的,但它是 Python 程序员所说的不友好的。
这也是相当危险的,因为很容易忘记关闭一个文件,而且有时这不是我们所能控制的--比如在一个 try 子句中发生错误,程序跳过了 except 子句的 close() 调用。
try:
requirements = open("requirements.txt", "w")
requirements.write(
"scikit-learn >= 0.24.2, < 0.25.0",
"numpy >= 1.21.2, < 1.22.0",
"pandas >= 1.3.3, < 1.4.0"
)
random_error = 25 / 0 # raises a 0 divide exception
requirements.close() # this is skipped
except:
print("An error occurred.")
上面的情况是相当不可能的。我无法想象在一个实例中,你要写出依赖关系,然后用一些数字来划分。但灾难的威胁是非常真实的。
在上面的代码中,close()方法被跳过了,因为在我们的代码中发现了一个错误,使得它跳到了except块。这可能会导致以后极难追踪的、文件损坏的错误。
一个更好的打开()和关闭()文件的方法是如下。
with open("requirements.txt", "w") as requirements:
requirements.write(
"scikit-learn >= 0.24.2, < 0.25.0",
"numpy >= 1.21.2, < 1.22.0",
"pandas >= 1.3.3, < 1.4.0"
)
requirements.close()
上面的代码更像Pythonic,而且更安全,因为一旦执行离开with语句块,文件总是被关闭。
3、 用is
比较None
值
与平等运算符==相比,用is身份运算符比较None值更合适。
"对None这样的单子的比较应该总是用is或is not来进行,而不是用平等运算符。"--PEP 8
其原因在于它们是如何进行比较的。
平等运算符==比较两个对象的值。
is身份运算符比较两个对象的身份。因此,它是一个平等的引用,这意味着它确定两个对象是否有相同的身份。
如果这一切听起来像行话,那么简单地说,在 Python 中,两个具有相同值的对象不一定是相同的。
# Example of equal values and identities
a = [1, 2, 3, 4, 5]
b = a id(a)
"""
140049469156864
"""id(b)
"""
140049469156864
"""a is b
"""
True
"""a == b
"""
True
"""# Example of equal values but different identities
a = [1, 2, 3, 4, 5]
b = a[:] id(a)
"""
139699152256576
"""id(b)
"""
139699151636672
"""a is b
"""
False
"""a == b
"""
True
"""
当你将一个值与None进行比较时,你应该总是使用is,因为即使对象实际上是None,平等运算符==仍然可以评估为True。
class Example:
def __eq__(self, other=None):
return Trueexample = Example()
example == None
"""
True
"""example is None
"""
False
"""
这种可能性是由于重载了==运算符而发生的。做例子是None,从字面上看是检查例子标识符中的值是否为None。基本上,如果一个变量被设置为None,那么比较它是否为None的结果总是为True--因为这个行为是可预测的,所以它是首选。
原始字符串有一个目的
在Python中以r或R为前缀的字符串被称为原始字符串。
print(r"This is a raw string")
"""
This is a raw string
"""print(R"This is also a raw string")
"""
This is also a raw string
"""
原始字符串最常见的用法是当我们处理一个使用了几个转义字符的字符串时(即窗口路径、正则表达式,或者如果我们想在一个字符串字面中插入文本,否则就不可能像')。
# without raw strings print("This is Kurtis\' phone")
"""
This is Kurtis' phone
"""print("C:\\Users\\kurtis\\documents")
"""
C:\Users\kurtis\documents
"""# with raw strings print(r"This is Kurtis' phone")
"""
This is Kurtis' phone
"""print(r"C:\Users\kurtis\documents")"""
C:\Users\kurtis\documents
"""
原始字符串不应该被视为一种不同类型的字符串数据类型--它不是。它只是一种方便的方式来输入包含几个反斜线的字符串。
F-字符串更适合用于格式化代码
在Python 3.6中增加的一个新特性是F-字符串(格式化字符串的缩写)。它们提供了一种更简洁、更方便的格式化字符串的方法--也与Python的可读性目标一致。
为了理解它的用处,我们必须看到到此为止的演变。最初,+运算符是用来连接字符串的。
name = "John"
age = "30"
city = "London"
print("Hi, my name is " + name + " and I'm " + age + " years old. I live in " + city )
虽然这种方法可以工作,但它包含了几个引号和+运算符,扭曲了可读性。
随后,Python引入了转换指定符%s,使其更加具体。
name = "John"
age = "30"
city = "London"
print("Hi, my name is %s and I'm %s years old. I live in %s" % (name, age, city))
这也可以,但对可读性来说仍然不是最好的。
下面是我们如何用f-字符串做同样的事情。
name = "John"
name = "John"
age = "30"
city = "London"
print(f"Hi, my name is {name} and I'm {age} years old. I live in {city}")
记住它们!
场景设置如时间序列的股票价格波动,可以参考上面的5种分类:
1、无序,有增有减
2、严格递增,一直升高
3、没有递减,存在价格不变的情况
4、严格递减,一直减少
5、保持不变
def sequence_classifier(arr):
if all(arr[i] == arr[i+1] for i in range(len(arr)-1)): return 5
if all(arr[i] < arr[i+1] for i in range(len(arr)-1)): return 1
if all(arr[i] <= arr[i+1] for i in range(len(arr)-1)): return 2
if all(arr[i] > arr[i+1] for i in range(len(arr)-1)): return 3
if all(arr[i] >= arr[i+1] for i in range(len(arr)-1)): return 4
return 0
solution 2nd
TYPE_SEQ = {(1,): 1, (0,1): 2, (-1,):3, (-1,0): 4, (0,): 5}
def sequence_classifier(arr):
countSet = { (a<b) - (a>b) for a,b in zip(arr, arr[1:]) }
return TYPE_SEQ.get(tuple(sorted(countSet)), 0)