>  기사  >  백엔드 개발  >  와서 다음 10가지 Python 질문에 도전해 보세요. 하시겠습니까?

와서 다음 10가지 Python 질문에 도전해 보세요. 하시겠습니까?

WBOY
WBOY앞으로
2023-05-02 11:16:061008검색

안녕하세요, 저는 Zheng 형제입니다. Python은 시작하기 쉽지만 마스터하기는 어렵습니다. 다음 10가지 질문은 매우 흥미롭고 어려울 수 있습니다.

문제가 먼저 주어지고, 답은 마지막에 나옵니다. 먼저 종이를 받아 답을 적고 마지막에 확인하는 것이 좋습니다.

다음 코드의 출력을 작성하세요.

1.Lazy Python

class A:
def function(self):
return A()
a = A()
A = int
print(a.function())

3.type 및 object

>>> round(7 / 2)
>>> round(3 / 2)
>>> round(5 / 2)

4. 클래스 내부 함수 우선 순위

>>> isinstance(type, object)
>>> isinstance(object, type)
>>> isinstance(object, object)
>>> isinstance(type, type)

6. Sum

>>> any([])
>>> all([])

7. 예상치 못한 속성

class A:
answer = 42
def __init__(self):
self.answer = 21
self.__add__ = lambda x, y: x.answer + y
def __add__(self, y):
return self.answer - y
print(A() + 5)

8. 음수의 배수인 문자열을 출력합니다.

>>> sum("")
>>> sum("", [])
>>> sum("", {})

10. 및 설명

다음 결과는 Python 3.8.5 버전에서 검증되었습니다.

1. Lazy Python

>>> sum([
el.imag 
for el in [
0, 5, 10e9, float('inf'), float('nan')
]
])

올바른 결과는 0:

이것은 어렵지 않습니다. Python의 함수 정의는 실제로 실행 가능한 명령문이고 호출되기 전에는 함수가 존재하지 않기 때문입니다. 변수가 바인딩됩니다.

위의 예에서 함수 정의 중에 Python은 아직 정의되지 않은 클래스나 함수에 대한 참조를 허용합니다. 그러나 실행 중에 A는 이미 int 클래스에 속합니다. 이는 함수 메서드가 기본값이 0인 새로 생성된 int 인스턴스를 반환한다는 의미입니다.

A = int가 없으면 결과는 다음과 같습니다.

来挑战下这十个 Python 问题,你会吗?

2

.

Rounding

>>> "this is a very long string" * (-1)

정확한 결과는 4 2 2입니다. 최종 라운드(2.5) == 2는 이는 Python의 round 방식이 모든 반값을 가장 가까운 짝수로 반올림하는 Banker's Rounding[1]을 구현하기 때문입니다.

来挑战下这十个 Python 问题,你会吗?3

.

type과 object
max(-0.0, 0.0)
는 모두 True입니다. object와 true가 같은 것인지 궁금합니다.

Python에서는 모든 것이 개체이므로 개체에 대한 모든 인스턴스 검사는 True를 반환합니다.

>>> x = (1 << 53) + 1
>>> x + 1.0 > x

type은 모든 Python 유형을 구성하는 데 사용되는 메타클래스를 나타냅니다. 따라서 int, str, object 등 모든 유형은 클래스 유형의 인스턴스이며 Python의 모든 객체와 마찬가지로 객체이기도 합니다. 그러나 유형은 Python에서 자신의 인스턴스인 유일한 객체입니다.
class A:
def function(self):
return A()
a = A()
A = int
print(a.function())
4

.

Empty boolean

>>> round(7/2)
4
>>> round(3/2)
2
>>> round(5/2)
2

인수가 빈 목록인 경우 모든 결과는 약간 예상치 못한 결과입니다. 그러나 검사 논리를 이해하고 나면 의미가 있습니다.

Python의 논리 연산자는 게으르다. any의 알고리즘은 처음으로 true로 나타나는 요소를 찾는 것입니다. 요소가 발견되지 않으면 False를 반환합니다. 비어 있으므로 어떤 요소도 true가 될 수 없으므로 any([])는 False를 반환합니다.

마찬가지로 all 알고리즘은 첫 번째 false 요소를 검색합니다. 찾지 못하면 True를 반환합니다. 빈 시퀀스에 false 요소가 없으므로 all([])은 True를 반환하는 개념이 아닙니다. 조금 비어있나요?5

.

클래스 내부 함수 우선순위

>>> isinstance(type, object)
True
>>> isinstance(object, type)
True
>>> isinstance(object, object)
True
>>> isinstance(type, type)
True
>>>

올바른 결과는 16:

객체 함수 검색 순서는 인스턴스 레벨 > 클래스 레벨 > 상위 클래스 레벨, 위 코드는 초기화 시 바인딩됩니다. 함수는 인스턴스 수준에 있고 클래스 내부에 정의된 함수는 클래스 수준에 있습니다.

그러나 이중 밑줄로 묶인 마법 함수는 이 규칙에 포함되지 않습니다. 즉, Python은 먼저 클래스 수준 마법 함수를 찾습니다.

이중 밑줄을 제거하면 결과는 26입니다.

来挑战下这十个 Python 问题,你会吗?

6

.

Sum

isinstance(Anything, object) #=> True。

여기에서 무슨 일이 일어나고 있는지 알아보려면 sum 함수의 서명을 확인해야 합니다.

>>> type(1)
<class 'int'>
>>> type(int)
<class 'type'>
>>> type(type)
<class 'type'>
>>> 
来挑战下这十个 Python 问题,你会吗? sum from 왼쪽에서 오른쪽으로 시작하여 반복 가능한 항목의 합계를 구하고 총계를 반환합니다. iterable은 일반적으로 숫자이며 시작 값은 문자열이 될 수 없습니다.

위의 모든 경우에서 빈 문자열은 빈 시퀀스로 처리되므로 sum은 단순히 시작 인수를 전체 결과로 반환합니다. 첫 번째 경우 기본값은 0이고, 두 번째와 세 번째 경우에는 시작 인수로 전달된 빈 목록과 사전을 의미합니다. 7

.

예상치 못한 속성

>>> any([])
False
>>> all([])
True
>>> any([True,False])
True
>>> all([True,False])
False
>>> 

위 코드에는 imag 속성이 있는데 전혀 정의하지 않았으며 실행시 오류가 보고되지 않았습니다. 무슨 일인가요?

이것은 에 있는 모든 숫자 유형 때문입니다. Python(int, real, float)은 모두 기본 객체 클래스에서 상속되며 모두 실수 및 이미지 속성을 지원하고 각각 실수 부분과 허수 부분을 반환합니다. 여기에는 Infinity와 NaN도 포함됩니다.

8.输出负数倍的字符串

>>> "this is a very long string" * (-1)
''
>>>

正确的结果是 '',所有的负数倍的字符串,都当作 0 倍,返回 ''。

9.见过负数的 0.0

max(-0.0, 0.0)

为什么会这样?出现这种情况是由于两个原因。负零和零在 Python 中被视为相等。max 的逻辑是,如果多个最大值,返回遇到的第一个。因此 max 函数返回第一次出现的零,它恰好是负数。

10.违反数学规则

>>> x = (1 << 53) + 1
>>> x + 1.0 > x
False

正确的结果是 False,这违反了数学规则啊,为什么呢?

这种违反直觉的行为归咎于三件事:长算术、浮点精度限制和数值比较。

Python 可以支持非常大的整数,如果隐式超过限制则切换计算模式,但 Python 中的浮点精度是有限的。

2⁵³ + 1 = 9007199254740993

是不能完全表示为 Python 浮点数的最小整数。因此,为了执行加 1.0,Python 将 9007199254740993 转换为 float,将其四舍五入为 Python 可以表示的 9007199254740992.0,然后向其添加 1.0,但由于相同的表示限制,它将其设置回 9007199254740992.0:

>>> float(9007199254740993)
9007199254740992.0
>>> 9007199254740992.0 + 1.0
9007199254740992.0
>>>

此外 Python 在 float 与 int 比较时并不会抛出错误,也不会尝试将两个操作数转换为相同的类型。相反,他们比较实际的数值。因为 9007199254740992.0 比 9007199254740993 小,因此 Python 返回 False。

위 내용은 와서 다음 10가지 Python 질문에 도전해 보세요. 하시겠습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 51cto.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제