Базовые знания для собеседований по Python-1

Python
Базовые знания для собеседований по Python-1

Начиная с сегодняшнего дня, я буду один за другим делиться некоторыми вопросами интервью, связанными с Python, и буду поощрять вас на пути обучения!

Ребята, обходите стороной! ! Конечно, если вы можете дать несколько советов, это было бы здорово!

Основы (1)

1. Зачем изучать Python

Язык Python прост, понятен и удобен в использовании, а благодаря развитию искусственного интеллекта он становится все более и более популярным.

2. Разница между интерпретируемым и компилируемым языками

Скомпилированный язык: составить все заполненные исходные программы в двоичные исполняемые программы. Затем вы можете запустить программу напрямую. Такие как: C, C ++

Интерпретируемый язык: переведите одно предложение завершенной исходной программы, затем выполните одно предложение до конца! Такие как: питон, (Java немного особенный. Java-программы также необходимо компилировать, но он не компилируется напрямую как машинный язык, а компилируется как байт-код, а затем байт-код выполняется в интерпретации.)

3. Кратко опишите строки, списки, кортежи и словари в Python.

Строка (str): Строка представляет собой произвольный текст, заключенный в кавычки, и является наиболее часто используемым типом данных в языках программирования.

Список. Список — это упорядоченная коллекция, в которую можно добавлять или удалять элементы.

Кортеж (кортеж): кортеж - заказанный набор, но не может быть изменен. I.E., кортежи неизменяются.

Словарь (Dict): словарь - неупорядоченная коллекция, состоящая из значений ключей.

Набор (set): представляет собой набор ключей, каждый элемент уникален, неповторяющийся и неупорядоченный.

4. Кратко опишите общие методы вышеуказанных типов данных

нить

  1. кусочек
mystr='luobodazahui'
mystr[1:3]

output

'uo'
  1. format
mystr2 = "welcome to luobodazahui, dear {name}"
mystr2.format(name="baby")

output

'welcome to luobodazahui, dear baby'
  1. join

Может использоваться для объединения строк, объединения элементов в строках, кортежах и списках с указанными символами (разделителями) для создания новой строки.

mylist = ['luo', 'bo', 'da', 'za', 'hui']
mystr3 = '-'.join(mylist)
print(mystr3)

outout

'luo-bo-da-za-hui'
  1. replace

String.replace(old,new,count) Заменить старые символы в строке новыми символами, count — это количество замен.

mystr4 = 'luobodazahui-haha'
print(mystr4.replace('haha', 'good'))

output

luobodazahui-good
  1. split

Обрезая строки, получить список.

mystr5 = 'luobo,dazahui good'
# 以空格分割
print(mystr5.split())
# 以h分割
print(mystr5.split('h'))
# 以逗号分割
print(mystr5.split(','))

output

['luobo,dazahui', 'good']
['luobo,daza', 'ui good']
['luobo', 'dazahui good']

Список

  1. кусочек

та же строка

  1. добавить и расширить

Добавить элементы в список Китай

mylist1 = [1, 2]
mylist2 = [3, 4]
mylist3 = [1, 2]
mylist1.append(mylist2)
print(mylist1)
mylist3.extend(mylist2)
print(mylist3)

outout

[1, 2, [3, 4]]
[1, 2, 3, 4]
  1. удалить элемент

Del: Удалить по индексу

pop: удалить последний элемент

удалить: удалить на основе значения элемента

mylist4 = ['a', 'b', 'c', 'd']
del mylist4[0]
print(mylist4)
mylist4.pop()
print(mylist4)
mylist4.remove('c')
print(mylist4)

output

['b', 'c', 'd']
['b', 'c']
['b']
  1. порядок элементов

sort: переупорядочить список в определенном порядке, по умолчанию от меньшего к большему, параметр reverse=True можно изменить на обратный порядок, от большого к меньшему.

реверс: инвертирует список.

mylist5 = [1, 5, 2, 3, 4]
mylist5.sort()
print(mylist5)
mylist5.reverse()
print(mylist5)

output

[1, 2, 3, 4, 5]
[5, 4, 3, 2, 1]

Словарь

  1. Пустой словарь

dict.clear()

dict1 = {'key1':1, 'key2':2}
dict1.clear()
print(dict1)

output

{}
  1. Указать удалить

Используйте метод pop, чтобы указать, что нужно удалить элемент из словаря.

dict1 = {'key1':1, 'key2':2}
d1 = dict1.pop('key1')
print(d1)
print(dict1)

output

1
{'key2': 2}
  1. перебирать словарь
dict2 = {'key1':1, 'key2':2}
mykey = [key for key in dict2]
print(mykey)
myvalue = [value for value in dict2.values()]
print(myvalue)
key_value = [(k, v) for k, v in dict2.items() ]
print(key_value)

output

['key1', 'key2']
[1, 2]
[('key1', 1), ('key2', 2)]
  1. fromkeys

Он используется для создания нового словаря с использованием элементов последовательности в качестве ключей словаря, а значением является начальное значение, соответствующее всем ключам словаря.

keys = ['zhangfei', 'guanyu', 'liubei', 'zhaoyun']
dict.fromkeys(keys, 0)

output

{'zhangfei': 0, 'guanyu': 0, 'liubei': 0, 'zhaoyun': 0}

5. Кратко опишите кодировку строк в Python

В исходной конструкции компьютера в качестве байта (byte) использовалось 8 бит (bit). Наибольшее целое число, которое может представлять байт, равно 255 (11111111 в двоичном формате = 255 в десятичном).Если вы хотите представить большее целое число, вы должны использовать больше байтов. В первые дни компьютер имел только кодировку ASCII, то есть содержал только прописные и строчные английские буквы, цифры и некоторые символы, чего явно не хватало для других языков, таких как китайский и японский. Позже был изобретен Юникод, который объединил все языки в набор кодировок, чтобы больше не было искаженных символов. Когда его нужно сохранить на жесткий диск или передать, он преобразуется в кодировку UTF-8. UTF-8 — это кодировка переменной длины, являющаяся частью Unicode. В Python строки в кодировке Unicode могут быть закодированы в указанные байты с помощью метода encode(), или байты могут быть закодированы в строки с помощью метода decode().

encode

"中文".encode('utf-8')

output

b'\xe4\xb8\xad\xe6\x96\x87'

decode

b'\xe4\xb8\xad\xe6\x96\x87'.decode('utf-8')

output

'中文'

6. Одна строка кода для реализации обмена ценностями

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

output

2 1

7. Разница между IS и ==

Давайте посмотрим на пример

c = d = [1,2]
e = [1,2]
print(c is d)
print(c == d)
print(c is e)
print(c == e)

output

True
True
False
True

== — это оператор сравнения, который только определяет, согласовано ли значение объекта, а is определяет, согласованы ли идентификаторы (адреса памяти) объектов. Идентификацию объекта можно просмотреть с помощью метода id().

id(c)
id(d)
id(e)

output

188748080
288748080
388558288

Видно, что сравнение is вернет True только тогда, когда идентификаторы согласуются, а сравнение == вернет True, когда значения согласуются.

8. Типы параметров в функциях Python

позиционные аргументы, аргументы по умолчанию, переменные аргументы, аргументы ключевого слова

9. Роль *arg и **kwarg

Позволяет нам передавать несколько аргументов при вызове функции

def test(*arg, **kwarg):
    if arg:
        print("arg:", arg)
    if kwarg:
        print("kearg:", kwarg)
test('ni', 'hao', key='world')

output

arg: ('ni', 'hao')
kearg: {'key': 'world'}

Как можно видеть, *arg преобразует позиционные аргументы в кортеж **kwarg преобразует аргументы ключевого слова в dict

10. Одна строка кода для получения суммы от 1 до 100

sum(range(1, 101))

11. Получить текущее время

import time
import datetime
print(datetime.datetime.now())
print(time.strftime('%Y-%m-%d %H:%M:%S'))

output

12019-06-07 18:12:11.165330
22019-06-07 18:12:11

12. Спецификация PEP8

Просто назову 10:

  • Старайтесь, чтобы только строчная буква «л», заглавная буква «О» и заглавная буква «я» не путались, как буквы.

  • В именах функций используются все строчные буквы и могут использоваться символы подчеркивания.

  • Константы именуются в верхнем регистре, можно использовать символы подчеркивания.

  • Логические элементы именуются с префиксом has или is, например: is_connect = True; has_member = False.

  • Не ставьте точку с запятой в конце строки и не используйте точку с запятой, чтобы поместить две команды в одну строку.

  • Не используйте обратную косую черту для соединения строк.

  • 2 строки между определениями верхнего уровня, 1 строка между определениями методов и 2 строки между определениями верхнего уровня.

  • Если класс не наследует от других классов, он наследует от явного объекта.

  • Перед классом, методом или переменной, используемой внутри, префикс «_», чтобы указать, что он используется внутри.

  • Используйте утверждения для реализации статической проверки типов.

13. Глубокое и поверхностное копирование в Python

мелкая копия

import copy
list1 = [1, 2, 3, [1, 2]]
list2 = copy.copy(list1)
list2.append('a')
list2[3].append('a')
print(list1, list2)

output

[1, 2, 3, [1, 2, 'a']] [1, 2, 3, [1, 2, 'a'], 'a']

Видно, что неглубокая копия успешно копирует только внешний слой списка «независимо», а внутренний список списка по-прежнему используется совместно.

глубокая копия

import copy
list1 = [1, 2, 3, [1, 2]]
list3 = copy.deepcopy(list1)
list3.append('a')
list3[3].append('a')
print(list1, list3)

output

[1, 2, 3, [1, 2]] [1, 2, 3, [1, 2, 'a'], 'a']

Глубокая копия делает два списка полностью независимыми, и операции по каждому списку не повлияют на другой.

14. Просмотрите вывод кода ниже

def num():
    return [lambda x:i*x for i in range(4)]
print([m(1) for m in num()])

output

[3, 3, 3, 3]

По бегущим результатам видно, что значение i равно 3, что удивительно.

15. Изменяемые и неизменяемые типы

Изменяемые типы данных: list, dict, set

Неизменяемые типы данных: int/float, str, tuple

16. Распечатайте таблицу умножения девять-девять.

for i in range(1, 10):
    for j in range(1, i+1):
        print("%s*%s=%s " %(i, j, i*j), end="")
    print()

output

11*1=1 
22*1=2 2*2=4 
33*1=3 3*2=6 3*3=9 
44*1=4 4*2=8 4*3=12 4*4=16 
55*1=5 5*2=10 5*3=15 5*4=20 5*5=25 
66*1=6 6*2=12 6*3=18 6*4=24 6*5=30 6*6=36 
77*1=7 7*2=14 7*3=21 7*4=28 7*5=35 7*6=42 7*7=49 
88*1=8 8*2=16 8*3=24 8*4=32 8*5=40 8*6=48 8*7=56 8*8=64 
99*1=9 9*2=18 9*3=27 9*4=36 9*5=45 9*6=54 9*7=63 9*8=72 9*9=81 

Функция печати будет переноситься по умолчанию.У нее есть параметр end по умолчанию.Если, как в примере, мы установим отображение параметра конца в "", то после выполнения функции печати она не будет переносить строку, поэтому она достигает девяти Эффект девяти таблица умножения.

17. Роль фильтра, карты и сокращения

Функция filter используется для фильтрации последовательности.Она принимает функцию и последовательность, применяет функцию к каждому элементу последовательности, а затем принимает решение о сохранении или отбрасывании элемента в зависимости от того, является ли возвращаемое значение True или False.

mylist = [1, 2, 3, 4, 5, 6, 7, 8, 9]
list(filter(lambda x: x%2 == 1, mylist))

output

[1, 3, 5, 7, 9]

сохранить нечетный список

Функция карты принимает функцию и последовательность, применяет функцию к каждому элементу последовательности и возвращает итерируемый объект.

mylist = [1, 2, 3, 4, 5, 6, 7, 8, 9]
list(map(lambda x: x*2, mylist))

output

[2, 4, 6, 8, 10, 12, 14, 16, 18]

Функция сокращения используется для рекурсивных вычислений, а также должна передавать функцию и последовательность и вычислять результат вычисления элементов функции и последовательности со следующим элементом.

from functools import reduce
reduce(lambda x, y: x+y, range(101))

output

15050

Видно, что три приведенные выше функции можно использовать в сочетании с анонимными функциями для написания мощного и лаконичного кода.

18. Сопоставление RE и поиск различий

Функция match() только проверяет, совпадает ли совпадающий символ в начале строки, а search() просматривает всю строку, чтобы найти совпадение.

19. Разница между __new__ и __init__ в объектной ориентации

__new__ вызывается перед созданием экземпляра, потому что его задача состоит в том, чтобы создать экземпляр, а затем вернуть объект экземпляра, который является статическим методом.

__init__ вызывается при создании экземпляра объекта, а затем устанавливает некоторые начальные значения свойств объекта, обычно при инициализации экземпляра класса. является методом экземпляра.

1. __new__ должен иметь по крайней мере один параметр cls, представляющий текущий класс.Этот параметр автоматически распознается интерпретатором Python при создании экземпляра.

2. __new__ должен иметь возвращаемое значение и возвращать конкретизированный экземпляр.На этот момент следует обратить особое внимание при реализации __new__ самостоятельно.Вы можете вернуть экземпляр из родительского класса (через super(имя текущего класса, cls)) __new__ , или непосредственно экземпляр объекта __new__.

3. __init__ имеет сам параметр, который является экземпляром, возвращаемым этим __new__. __Init__ может завершить некоторые другие действия инициализации на основе __new__, а __init__ не нужно возвращать значение.

4. Если __New__ создает экземпляр текущего класса, функция __init__ будет автоматически вызвана. Первый параметр функции __new__, вызываемых в операторе возврата, представляет собой CLS для обеспечения того, чтобы он был экземпляром текущего класса. Если это другое Учебное имя класса, то фактическое создание и возвращение - это экземпляры других классов, на самом деле, функция __init__ текущего класса не будет называться, ни функцией __init__ других классов.

20. Тернарные правила операции

a, b = 1, 2
# 若果 a>b 成立  就输出  a-b  否则 a+b
h = a-b if a>b else a+b

output

13

21. Генерация случайных чисел

print(random.random())
print(random.randint(1, 100))
print(random.uniform(1,5))

output

10.03765019937131564
218
31.8458555362279228

22. Использование функции zip

Функция zip() принимает в качестве параметра итерируемый объект, упаковывает соответствующие элементы объекта в кортежи и возвращает список этих кортежей.

list1 = ['zhangfei', 'guanyu', 'liubei', 'zhaoyun']
list2 = [0, 3, 2, 4]
list(zip(list1, list2))

output

[('zhangfei', 0), ('guanyu', 3), ('liubei', 2), ('zhaoyun', 4)]

23. Разница между диапазоном и xrange

range([start,] stop[ step]), в соответствии с диапазоном, заданным start и stop, и размером шага, заданным step, сгенерировать последовательность. И xrange генерирует генератор, который может сэкономить много памяти.

24. Роль метода with для открытия файла

Могут быть некоторые ненормальные ситуации при открытии файла при чтении и записи.Если мы следуем обычному методу записи f.open, нам нужно попробовать, за исключением, наконец, ненормальных суждений, и независимо от того, с чем сталкивается файл, мы должны выполнить finally f..close() закрывает файл, а метод with помогает нам реализовать f.close в finally.

25. Что такое обычное жадное сопоставление

По умолчанию в Python используется режим жадного сопоставления.

Жадный режим: регулярные выражения обычно имеют максимальную длину.

Нежадный режим: ищите как можно меньше совпадений при условии, что все выражение успешно совпадает.

26. Почему не рекомендует аргумент по умолчанию функции переменной объектов

Например:

def test(L=[]):
    L.append('test')
    print(L)

output

test() # ['test']
test() # ['test', 'test']

Параметром по умолчанию является список, который представляет собой переменный объект [].Когда функция определена в Python, вычисляется значение параметра по умолчанию L. Это [].Каждый раз при вызове функции, если значение L изменяется, при следующем вызове функции при вызове значение параметра по умолчанию больше не [].

27. Строка для списка

mystr = '1,2,3'
mystr.split(',')

output

['1', '2', '3']

28. Преобразование строки в целое число

mylist = ['1', '2', '3']
list(map(lambda x: int(x), mylist))

output

[1, 2, 3]

29. Удалить повторяющиеся значения в списке

mylist = [1, 2, 3, 4, 5, 5]
list(set(mylist))

30. Статистика строковых слов

from collections import Counter
mystr = 'sdfsfsfsdfsd,were,hrhrgege.sdfwe!sfsdfs'
Counter(mystr)

output

 Counter({'s': 9,
          'd': 5,
          'f': 7,
          ',': 2,
          'w': 2,
          'e': 5,
          'r': 3,
          'h': 2,
          'g': 2,
         '.': 1,
         '!': 1})

31. Список понимания, нахождение нечетных и четных чисел

[x for x in range(10) if x%2 == 1]

output

[1, 3, 5, 7, 9]

32. Линия кода для расширения списка

list1 = [[1,2],[3,4],[5,6]]
[j for i in list1 for j in i]

output

[1, 2, 3, 4, 5, 6]

33. Реализуйте функцию бинарного поиска

Алгоритм бинарного поиска также называется половинным поиском.Основная идея состоит в том, чтобы разделить пополам, сравнить размер, а затем уменьшить вдвое поиск.Это должна быть упорядоченная последовательность, прежде чем можно будет использовать двоичный поиск. рекурсивный алгоритм

 def binary_search(data, item):
     # 递归
     n = len(data)
     if n > 0:
         mid = n // 2
         if data[mid] == item:
             return True
         elif data[mid] > item:
             return binary_search(data[:mid], item)
        else:
            return binary_search(data[mid+1:], item)
    return False
list1 = [1,4,5,66,78,99,100,101,233,250,444,890]
binary_search(list1, 999)

нерекурсивный алгоритм

 def binary_search(data, item):
     # 非递归
     n = len(data)
     first = 0
     last = n - 1
     while first <= last:
         mid = (first + last)//2
         if data[mid] == item:
             return True
        elif data[mid] > item:
            last = mid - 1
        else:
            first = mid + 1
    return False
list1 = [1,4,5,66,78,99,100,101,233,250,444,890]
binary_search(list1, 99)

34. Словарь и преобразование json

словарь в json

import json
dict1 = {'zhangfei':1, "liubei":2, "guanyu": 4, "zhaoyun":3}
myjson = json.dumps(dict1)
myjson

output

'{"zhangfei": 1, "liubei": 2, "guanyu": 4, "zhaoyun": 3}'

json повернуть словарь

mydict = json.loads(myjson)
mydict

output

{'zhangfei': 1, 'liubei': 2, 'guanyu': 4, 'zhaoyun': 3}

35. Понимание списка, понимание словаря и генераторы

import random
td_list=[i for i in range(10)]
print("列表推导式", td_list, type(td_list))
ge_list = (i for i in range(10))
print("生成器", ge_list)
dic = {k:random.randint(4, 9)for k in ["a", "b", "c", "d"]}
print("字典推导式",dic,type(dic))

output

列表推导式 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] <class 'list'>
生成器 <generator object <genexpr> at 0x0139F070>
字典推导式 {'a': 6, 'b': 5, 'c': 8, 'd': 9} <class 'dict'>

36. Кратко опишите разницу между read, readline и readlines

read читает весь файл

readline читает следующую строку, используя метод генератора

readlines считывает весь файл в итератор, чтобы мы могли его пройти

37. Список расстроенных

list2 = [1, 2, 3, 4, 5, 6]
random.shuffle(list2)
print(list2)

output

[4, 6, 5, 1, 2, 3]

38. Обратная струна

str1 = 'luobodazahui'
str1[::-1]

output

'iuhazadoboul'

39. Роль одинарного и двойного подчеркивания

__foo__: соглашение, внутреннее имя Python, используемое для различения других определяемых пользователем имен для предотвращения конфликтов, таких как специальные методы, такие как __init__() и __del__() и __call__().

_foo: соглашение, используемое для того, чтобы сделать переменные закрытыми. Его нельзя импортировать с помощью from module import *, а доступ к другим аспектам осуществляется как к общедоступным переменным.

__foo: Это имеет реальный смысл: анализатор использует _classname__foo для замены этого имени, чтобы отличить его от того же имени, что и у других классов, к нему нельзя получить прямой доступ, как к открытому члену, но к нему можно получить доступ через objectname._classname__xxx.

40. Классы нового и старого стиля

А. В Python, наследуя класс Object, это новый класс.

б) В Python 3 есть только классы нового стиля.

C. В Python2 новый класс, который наследует объект, является новым классом, а класс, который не записывает родительский класс, является классическим классом.

г. В настоящее время классические классы практически не используются в Python.

41. Каковы характеристики наследования в объектно-ориентированном Python

А. Поддержка как одиночного наследования, так и множественного наследования.Когда есть только один родительский класс, это одиночное наследование, а когда есть несколько родительских классов, это множественное наследование.

Б. Подкласс унаследует все свойства и методы родительского класса, а также подкласс может переопределить переменные и методы с тем же именем родительского класса.

в) Построение базового класса в наследовании (__init__()) не вызывается автоматически, его нужно вызывать специально при построении его производного класса.

г. При вызове метода базового класса необходимо префикс имени класса базового класса, и вам необходимо привести переменную параметра self. Разница в том, что при вызове обычной функции в классе вам не нужно брать параметр self.

42. Роль суперфункции

Функция super() — это метод, используемый для вызова родительского класса (суперкласса).

 class A():
     def funcA(self):
         print("this is func A")
 class B(A):
     def funcA_in_B(self):
         super(B, self).funcA()
 
     def funcC(self):
         print("this is func C")

ins = B()
ins.funcA_in_B()
ins.funcC()

output

this is func A
this is func C

43. Различные функции в классе

Примеры метода разделены на класс статических методов

Метод экземпляра:

Определение: первый параметр должен быть объектом экземпляра, а имя параметра обычно согласуется как "self", через которое передаются атрибуты и методы экземпляра (атрибуты и методы класса также могут передаваться);

Invoke: Может вызываться только объектами-экземплярами.

метод класса:

Определение: используйте декоратор @classmethod. Первым параметром должен быть текущий объект класса, а имя параметра обычно согласуется как "cls", через которое передаются атрибуты и методы класса (атрибуты и методы экземпляра не могут быть переданы);

Invoke: могут быть вызваны как объекты экземпляра, так и объекты класса.

Статический метод:

Определение: используйте декоратор @staticmethod. Параметры необязательны, параметров «self» и «cls» нет, но в теле метода нельзя использовать какие-либо свойства и методы класса или экземпляра;

Invoke: могут быть вызваны как объекты экземпляра, так и объекты класса.

Статические методы являются функциями внутри класса и не требуют экземпляра. Статические методы в основном используются для хранения логического кода, в основном потому, что некоторая логика принадлежит классу, но нет взаимодействия с самим классом. То есть в статическом методе не будет задействована работа методов и свойств в классе. Это можно понимать как наличие статических методов в пространстве имен этого класса. Методы класса — это методы, которые работают с самим классом как с объектом. Разница между ним и статическим методом заключается в том, что независимо от того, вызывается ли этот метод из экземпляра или класса, он использует первый параметр для передачи класса.

44. Как определить, функция это или метод

Функция, которая не привязана к классу или экземпляру, является функцией Функции, привязанные к классам и экземплярам, ​​принадлежат методам

Нормальная функция:

def func1():
    pass
print(func1)

output

<function func1 at 0x01379348>

Классные функции:

 class People(object):
     def func2(self):
         pass
     @staticmethod
     def func3():
         pass
     @classmethod
     def func4(cls):
         pass
people = People()
print(people.func2)
print(people.func3)
print(people.func4)

output

<bound method People.func2 of <__main__.People object at 0x013B8C90>>
<function People.func3 at 0x01379390>
<bound method People.func4 of <class '__main__.People'>>

45. Роль isinstance и отличие от type()

isinstance(), чтобы определить, относится ли объект к известному типу, аналогично type().

разница:

type() не считает подклассы типом суперкласса, независимо от наследования.

isinstance() будет рассматривать подкласс как тип суперкласса, учитывая отношения наследования.

 class A(object):
     pass
 class B(A):
     pass
 a = A()
 b = B()
 print(isinstance(a, A))
 print(isinstance(b, A))
 print(type(a) == A)
 print(type(b) == A)

output

True
True
True
False

46. ​​Паттерн Singleton и фабричный шаблон

Шаблон Singleton: основная цель — гарантировать, что существует только один экземпляр класса.

Фабричный шаблон: охватывает суперкласс, который предоставляет абстрактный интерфейс для создания объекта определенного типа, а не решает, какие объекты могут быть созданы.

47. Просмотреть все файлы в каталоге

import os
print(os.listdir('.'))

48. Вычислите неповторяющиеся трехзначные числа от 1 до 5.

 # 1到5组成的互不重复的三位数
 k = 0
 for i in range(1, 6):
     for j in range(1, 6):
         for z in range(1, 6):
             if (i != j) and (i != z) and (j != z):
                 k += 1
                 if k%6:
                     print("%s%s%s" %(i, j, z), end="|")
                else:
                    print("%s%s%s" %(i, j, z))

output

 1123|124|125|132|134|135
 2142|143|145|152|153|154
 3213|214|215|231|234|235
 4241|243|245|251|253|254
 5312|314|315|321|324|325
 6341|342|345|351|352|354
 7412|413|415|421|423|425
 8431|432|435|451|452|453
 9512|513|514|521|523|524
10531|532|534|541|542|543

49. Удалить начальные и конечные пробелы из строки

str1 = "   hello nihao    "
str1.strip()

output

'hello nihao'

50. Удалите пробелы в середине строки

str2 = "hello you are good"
print(str2.replace(" ", ""))
"".join(str2.split(" "))

output

helloyouaregood
'helloyouaregood'

Вот и все для первой части серии вопросов интервью, увидимся в следующий раз!

Добро пожаловать, чтобы обратить внимание на мой публичный аккаунт WeChat - солянка из редьки, или отсканируйте QR-код ниже, давайте общаться, учиться и прогрессировать вместе!