2019 Python Интервью 100 вопросов

Python

Следующий контент взят из небольшой программы «Банк вопросов для интервью по программированию», эта статья была впервые опубликована на публичном аккаунте «zone7».

0 Сталкивались ли вы со стратегиями и решениями против рептилий?

1. Антикраулеры через заголовки 2. Краулер на основе поведения пользователя: (частота доступа к одному и тому же IP за короткий промежуток времени) 3. Динамические антисканеры веб-страниц (запрашивают данные через ajax или генерируют через JavaScript) 4. Часть данных зашифрована (данные искажены)

Решение:

Для сканирования основных веб-страниц вы можете настроить заголовки и добавить данные заголовков. Используйте несколько IP-адресов прокси для сканирования или установите более низкую частоту сканирования, Динамические веб-страницы можно сканировать с помощью selenium + phantomjs. Чтобы зашифровать часть данных, вы можете использовать селен для создания скриншотов и использовать библиотеку pytesseract, которая поставляется с python для идентификации, но более медленный и самый прямой метод — найти метод шифрования для обратного рассуждения.

1 В чем разница между urllib и urllib2?

  • И urllib, и urllib2 являются связанными модулями, которые принимают URL-запросы, но urllib2 может принимать экземпляр класса Request для установки заголовков URL-запросов, а urllib может принимать только URL-адреса. urllib не может подделать вашу строку User-Agent.
  • urllib предоставляет метод urlencode() для генерации строки запроса GET, а urllib2 — нет. Вот почему urllib часто используется с urllib2.

2 Перечислите пакеты сетевых данных, используемые поисковым роботом, и проанализируйте пакеты?

  • Сетевые пакеты urllib, urllib2, запросы
  • Разобрать пакеты re, xpath, красивый суп, lxml

3 Кратко опишите действия обходчика?

  1. Определить спрос;
  2. определить ресурсы;
  3. Получить данные возврата веб-сайта через URL-адрес;
  4. данные о местоположении;
  5. Хранение данных.

4 Как быть с механизмом защиты от переползания?

Противоподъемный механизм:

направление заголовков Судья пользовательский агент, судья референссу, судья cookie. Добавьте все заголовочные данные браузера ПРИМЕЧАНИЕ: accept-encoding; gzip, deflate нужно прокомментировать

5 Каковы распространенные HTTP-методы?

  • GET: запросить указанную информацию о странице и вернуть тело объекта;
  • HEAD: Аналогичен запросу на получение, за исключением того, что в возвращаемом ответе нет определенного содержимого, которое используется для захвата заголовка;
  • POST: отправьте данные на указанный ресурс для обработки запросов (например, отправки формы или загрузки файла). Данные включаются в тело запроса.
  • PUT: передать данные от клиента на сервер для замены содержимого указанного документа;
  • DELETE: запрос на удаление указанной страницы;
  • ПОДКЛЮЧЕНИЕ: протокол HTTP1.1 зарезервирован для прокси-серверов, которые могут изменить режим подключения на режим конвейера;
  • ПАРАМЕТРЫ: позволяет клиенту просматривать производительность сервера; TRACE: повторите запрос сервера, в основном используется для тестирования или диагностики.

6 Расскажите о роли redis в redis-scrapy?

Он заменяет Scheduler в среде scrapy базой данных Redis для реализации совместного управления очередью.

преимущество:

  1. Может в полной мере использовать пропускную способность нескольких машин;
  2. Можно воспользоваться IP-адресами нескольких машин.

7 Стратегии борьбы с рептилиями и решения?

  1. Антисканеры через заголовки: настраивайте заголовки и добавляйте данные заголовков на веб-страницы.
  2. Антикраулеры, основанные на поведении пользователя (блокировка IP): вы можете использовать несколько IP-адресов прокси для сканирования или уменьшения частоты сканирования.
  3. Антикраулер динамических веб-страниц (данные запроса JS или Ajax): динамические веб-страницы можно сканировать с помощью selenium + phantomjs.
  4. Обработка шифрования некоторых данных (искаженные символы данных): найдите метод шифрования для обратного рассуждения.

8 Если вас попросят запретить поисковым роботам веб-сайта, как вы должны увеличить сложность сканирования?

  1. Оцените User-Agent заголовков;
  2. Определить частоту доступа одного и того же IP;
  3. Данные получены через Ajax;
  4. Поведение сканирования заключается в сканировании исходного файла страницы.Если вы хотите сканировать html-код статической веб-страницы, вы можете использовать jquery для имитации написания html.

9 скрап делится на несколько компонентов? Каков эффект каждого?

Разделен на 5 частей: Spiders (сканеры), Scrapy Engine (движок), Scheduler (планировщик), Downloader (загрузчик), Item Pipeline (конвейер обработки).

  • Пауки: класс, настроенный разработчиками для анализа веб-страниц и сканирования содержимого, возвращаемого указанным URL-адресом.
  • Scrapy Engine: управляет потоком обработки данных во всей системе и запускает обработку транзакций.
  • Планировщик: Получайте запросы, отправленные движком, и помещайте эти запросы в очередь обработки, чтобы они могли быть предоставлены движком позже, когда это необходимо.
  • Загрузить: получить информацию о веб-странице и предоставить ее движку, который затем перенаправляется в Spiders.
  • Конвейер элементов: отвечает за обработку данных, извлеченных классом Spiders. Например, очистка данных HTML, проверка просканированных данных (проверка того, что элемент содержит определенные поля), проверка на наличие дубликатов (и удаление) и сохранение результатов сканирования в базе данных.

10 Кратко опишите основной процесс скрапинга?

image

scrapy делится на 9 шагов:

  1. Паукам нужен начальный start_url или функция stsrt_requests, которая будет генерировать запросы внутри Engine;
  2. Движок отправляет запросы планировщику;
  3. Engine получает запросы от планировщика и передает их Download для скачивания;
  4. В процессе передачи в Dowmload он будет проходить через Downloader Middlewares (через функцию process_request);
  5. После того, как Dowmloader загрузит страницу, будет сгенерирован ответ, и ответ будет передан Engine, во время этого процесса он будет проходить через Downloader Middlerwares (через функцию process_request), и если есть ошибка в передаче, он пройдет через функцию process_exception;
  6. Движок отправляет ответ, отправленный загрузчиком, на обработку паукам, этот процесс проходит через промежуточное ПО пауков (через функцию process_spider_input);
  7. Spiders обрабатывает этот ответ, возвращает два типа Requests или Item и передает их движку.Этот процесс проходит через промежуточное ПО Spiders (через функцию Porsche_spider_output);
  8. Механизм получает возвращенную информацию, и если это элемент, он будет передан в конвейер элементов, если это запрос, он будет передан планировщику для продолжения сканирования;
  9. Повторяйте третий шаг, пока не останется данных для сканирования.

11 Что означает перечисление в языке python3.5

Для итерируемого/проходимого объекта (например, списка, строки) enumerate будет составлять его в последовательность индексов и использовать его для одновременного получения индекса и значения. enumerate в основном используется для подсчета в циклах for

12 Вы знаете о безголовом браузере Google?

Безголовый браузер или безголовый браузер — это браузер без интерфейса. Поскольку это браузер, в нем должно быть все, что должно быть в браузере, но он не может видеть интерфейс.

PhantomJS в модуле selenium в Python — это браузер без интерфейса (безголовый браузер): это безголовый браузер на основе QtWebkit.

13 Разница между скрэпи и скрэпи-редис?

scrapy — это общая структура искателя, но она не поддерживает распределенный, scrapy-redis предоставляет некоторые компоненты на основе Redis для более удобной реализации распределенного искателя

Почему стоит выбрать базу данных Redis?

Поскольку Redis поддерживает синхронизацию master-slave, а данные кэшируются в памяти, распределенный поисковый робот на основе Redis очень эффективен для высокочастотного чтения запросов и данных.

Что такое синхронизация master-slave?

В Redis пользователи могут позволить одному серверу реплицировать другой сервер, выполнив команду SLAVEOF или установив параметр slaveof. Мы называем реплицированный сервер главным сервером, а сервер, который реплицирует главный сервер, называется главным сервером. Он называется подчиненным. Когда клиент отправляет подчиненному серверу команду SLAVEOF, прося подчиненный сервер скопировать главный сервер, подчиненный сервер сначала должен выполнить операцию синхронизации, то есть обновить статус базы данных подчиненного сервера до текущего состояния главного сервера.состояние базы данных на

14 Преимущества и недостатки скрапинга? Почему стоит выбрать фреймворк scrapy?

преимущество:

Используйте более удобочитаемый xpath вместо обычного. Мощная система статистики и журналов. Одновременное сканирование по разным URL-адресам. Поддержка режима оболочки, простая отладка независимо.

недостаток:

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

15 Использование scrapy и запросов?

запросы являются опросными, которые будут заблокированы сетью и не подходят для обхода больших объемов данных

Нижний слой scapy — это асинхронный фреймворк, а параллелизм — самое большое преимущество.

16 Опишите механизм работы фреймворка scrapy?

Получите первый пакет URL-адресов из start_urls для отправки запросов. Запрос отправляется планировщику механизмом запросов. После завершения запроса планировщик отправляет пару запросов загрузчику, чтобы получить ресурсы ответа, соответствующие запросу, и отправляет ответ на Для обработки извлечения используется метод парсинга, написанный вами. Если необходимые данные извлечены, они передаются в конвейер для обработки. Если URL извлечен, предыдущие шаги продолжаются до тех пор, пока в несколько столбцов, и программа завершается.

17 Что лучше использовать для написания сканера: многопроцессорный или многопоточный?

Код с интенсивным вводом-выводом (обработка файлов, поисковый робот и т. д.), многопоточность может эффективно повысить эффективность (операции ввода-вывода в одном потоке будут ожидать ввода-вывода, вызывая ненужную трату времени, а включение многопоточности может автоматически ожидать потока A, когда ждет поток A. Переключение на поток B не может тратить ресурсы ЦП, тем самым повышая эффективность выполнения программы). В самом процессе сбора данных необходимо учитывать не только скорость сети и отклик, но и аппаратную ситуацию самой машины, настроить многопроцессорность или многопоточность

18 Распространенные средства защиты от рептилий и контрмеры?

  1. В зависимости от поведения пользователя один и тот же IP-адрес обращается к одной и той же странице несколько раз в течение определенного периода времени, используя прокси-IP для создания пула IP-адресов.
  2. Агент пользователя в заголовке запроса создает пул агентов пользователя (разные операционные системы и браузеры, имитирующие разных пользователей).
  3. Динамическая загрузка (захваченные данные отличаются от того, что отображает браузер), js-рендеринг имитирует ajax-запросы и возвращает данные в виде json.
  4. selenium/webdriver имитирует загрузку браузера
  5. Анализ захваченных данных
  6. Поле параметров шифрования Отслеживание сеанса [cookie] Настройки анти-лича [Referer

19 Какие проблемы в основном решает распределенный поисковый робот?

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

Его эффективность разработки является относительно быстрой и простой.

20 Как повысить эффективность сканирования?

Основная причина медленной загрузки краулера — блокировка в ожидании отправки запроса на сайт и возврата сайта

    1,采用异步与多线程,扩大电脑的cpu利用率;

    2,采用消息队列模式

    3,提高带宽

21 Что такое протокол сканера?

Протокол роботов (также известный как протокол сканера, правила сканера, протокол робота и т. д.) также называется robots.txt. Веб-сайт сообщает поисковым системам, какие страницы можно сканировать, а какие нельзя сканировать с помощью протокола robots.

Протокол Robots — это общепринятый этический кодекс международного интернет-сообщества веб-сайтов, цель которого — защитить данные веб-сайтов и конфиденциальную информацию, а также гарантировать, что личная информация и конфиденциальность пользователей не будут нарушены. Поскольку это не приказ, поисковые системы должны сознательно выполнять его.

22 Что делать, если веб-сайт другой стороны защищен от сканирования и IP-адрес заблокирован?

  1. Замедлите скорость сканирования и уменьшите нагрузку на целевой веб-сайт, но это уменьшит объем сканирования данных в единицу времени.
  2. Используйте прокси-IP (бесплатный может быть нестабильным, платный может быть бесполезным)

23 Есть файл в формате jsonline

def get_lines():
    with open('file.txt','rb') as f:
        return f.readlines()

if __name__ == '__main__':
    for e in get_lines():
        process(e) # 处理每一行数据

Сейчас хочу обработать файл размером 10G, а памяти всего 4G.Если изменена только функция get_lines, а остальные коды остались без изменений, как это должно быть реализовано? Какие вопросы необходимо рассмотреть?

def get_lines():
    with open('file.txt','rb') as f:
        for i in f:
            yield i

Методы, предоставленные Pandaaaa906

from mmap import mmap


def get_lines(fp):
    with open(fp,"r+") as f:
        m = mmap(f.fileno(), 0)
        tmp = 0
        for i, char in enumerate(m):
            if char==b"\n":
                yield m[tmp:i+1].decode()
                tmp = i+1

if __name__=="__main__":
    for i in get_lines("fp_some_huge_file"):
        print(i)

Проблемы, которые необходимо учитывать: память имеет только 4G и не может одновременно читать файлы 10G.Необходимо читать данные пакетами и записывать позицию каждого считанного данных. Размер каждого чтения данных в пакетах слишком мал, операция чтения займет слишком много времени.stackoverflow.com/questions/3…

24 Добавить недостающий код

def print_directory_contents(sPath):
"""
这个函数接收文件夹的名称作为输入参数
返回该文件夹中文件的路径
以及其包含文件夹中文件的路径
"""
import os
for s_child in os.listdir(s_path):
    s_child_path = os.path.join(s_path, s_child)
    if os.path.isdir(s_child_path):
        print_directory_contents(s_child_path)
    else:
        print(s_child_path)

25 Введите число и определите день года?

import datetime
def dayofyear():
    year = input("请输入年份: ")
    month = input("请输入月份: ")
    day = input("请输入天: ")
    date1 = datetime.date(year=int(year),month=int(month),day=int(day))
    date2 = datetime.date(year=int(year),month=1,day=1)
    return (date1-date2).days+1

26 Дезорганизовать объект отсортированного списка alist?

import random
alist = [1,2,3,4,5]
random.shuffle(alist)
print(alist)

27 Существующий словарь d= {'a':24,'g':52,'i':12,'k':33} Сортировать по значению?

sorted(d.items(),key=lambda x:x[1])

28 словарных понятий

d = {key:value for (key,value) in iterable}

29 Пожалуйста, переверните строку "aStr"?

print("aStr"[::-1])

30 Обработать строку «k:1 |k1:2|k2:3|k3:4» в словарь {k:1,k1:2,

str1 = "k:1|k1:2|k2:3|k3:4"
def str2dict(str1):
    dict1 = {}
    for iterms in str1.split('|'):
        key,value = iterms.split(':')
        dict1[key] = value
    return dict1
#字典推导式
d = {k:int(v) for t in str1.split("|") for k, v in (t.split(":"), )}

31 Пожалуйста, отсортируйте элементы в списке по возрасту от большего к меньшему.

alist = [{'name':'a','age':20},{'name':'b','age':30},{'name':'c','age':25}]
def sort_by_age(list1):
    return sorted(alist,key=lambda x:x['age'],reverse=True)

32 Что выведет следующий код?

list = ['a','b','c','d','e']
print(list[10:])

Код выведет [] без возникновения ошибки IndexError, как и ожидалось, пытаясь получить элемент списка с индексом, превышающим количество элементов. Например, попытка получить list[10] и далее приведет к ошибке IndexError. Однако попытка получить фрагмент списка, начинающийся с индекса, который превышает количество членов, не вызовет IndexError, а просто вернет пустой список. Это становится особенно отвратительным усложнением, потому что при запуске не генерируется никаких ошибок, что затрудняет отслеживание ошибок.

33 Напишите понимание списка, которое производит арифметическую последовательность с допуском 11

print([x*11 for x in range(10)])

34 Имея два списка, как найти одинаковые и разные элементы?

list1 = [1,2,3]
list2 = [3,4,5]
set1 = set(list1)
set2 = set(list2)
print(set1 & set2)
print(set1 ^ set2)

35 Пожалуйста, напишите кусок кода на Python, чтобы удалить повторяющиеся элементы в списке?

l1 = ['b','c','d','c','a','a']
l2 = list(set(l1))
print(l2)

Используйте метод сортировки класса списка:

l1 = ['b','c','d','c','a','a']
l2 = list(set(l1))
l2.sort(key=l1.index)
print(l2)

Это также можно записать так:

l1 = ['b','c','d','c','a','a']
l2 = sorted(set(l1),key=l1.index)
print(l2)

Вы также можете использовать обход:

l1 = ['b','c','d','c','a','a']
l2 = []
for i in l1:
    if not i in l2:
        l2.append(i)
print(l2)

36 Даны два списка A, B. Найдите одинаковые и разные элементы в A и B с помощью

A,B 中相同元素: print(set(A)&set(B))
A,B 中不同元素:  print(set(A)^set(B))

37 В чем разница между классами нового стиля Python и классическими классами?

А. В Python все классы, которые наследуют объект, являются классами нового стиля.

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

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

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

38 Какие встроенные структуры данных есть в Python?

а. целое целое, длинное длинное, число с плавающей запятой, сложное комплексное

B. Строка str, список, кортеж

C. Словарь dict , набор коллекций

г. В Python3 нет long, только бесконечная точность int

39 Как Python реализует шаблон singleton?Напишите, пожалуйста, две реализации?

Первый способ: используйте декоратор

def singleton(cls):
    instances = {}
    def wrapper(*args, **kwargs):
        if cls not in instances:
            instances[cls] = cls(*args, **kwargs)
        return instances[cls]
    return wrapper
    
    
@singleton
class Foo(object):
    pass
foo1 = Foo()
foo2 = Foo()
print(foo1 is foo2)  # True

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

class Singleton(object):
    def __new__(cls, *args, **kwargs):
        if not hasattr(cls, '_instance'):
            cls._instance = super(Singleton, cls).__new__(cls, *args, **kwargs)
        return cls._instance
    
    
class Foo(Singleton):
    pass

foo1 = Foo()
foo2 = Foo()

print(foo1 is foo2)  # True

Третий метод: метакласс. Метакласс — это класс, используемый для создания объектов класса. Метод вызова должен вызываться, когда объект класса создает объект экземпляра. Поэтому при вызове вызова убедитесь, что всегда создается только один экземпляр. Тип — это мета python.kind

class Singleton(type):
    def __call__(cls, *args, **kwargs):
        if not hasattr(cls, '_instance'):
            cls._instance = super(Singleton, cls).__call__(*args, **kwargs)
        return cls._instance


# Python2
class Foo(object):
    __metaclass__ = Singleton

# Python3
class Foo(metaclass=Singleton):
    pass

foo1 = Foo()
foo2 = Foo()
print(foo1 is foo2)  # True

40 инвертирует целое число, например -123 -> -321

class Solution(object):
    def reverse(self,x):
        if -10<x<10:
            return x
        str_x = str(x)
        if str_x[0] !="-":
            str_x = str_x[::-1]
            x = int(str_x)
        else:
            str_x = str_x[1:][::-1]
            x = int(str_x)
            x = -x
        return x if -2147483648<x<2147483647 else 0
if __name__ == '__main__':
    s = Solution()
    reverse_int = s.reverse(-120)
    print(reverse_int)

41 Разработать и внедрить обход каталогов и подкаталогов и захват файлов .pyc?

первый метод:

import os

def get_files(dir,suffix):
    res = []
    for root,dirs,files in os.walk(dir):
        for filename in files:
            name,suf = os.path.splitext(filename)
            if suf == suffix:
                res.append(os.path.join(root,filename))

    print(res)

get_files("./",'.pyc')

Второй метод:

import os

def pick(obj):
    if ob.endswith(".pyc"):
        print(obj)

def scan_path(ph):
    file_list = os.listdir(ph)
    for obj in file_list:
        if os.path.isfile(obj):
    pick(obj)
        elif os.path.isdir(obj):
            scan_path(obj)

if __name__=='__main__':
    path = input('输入目录')
    scan_path(path)

третий метод

from glob import iglob


def func(fp, postfix):
    for i in iglob(f"{fp}/**/*{postfix}", recursive=True):
        print(i)

if __name__ == "__main__":
    postfix = ".pyc"
    func("K:\Python_script", postfix)

42 Python — правильный способ удаления элементов при обходе списка

Обход работает с новым списком и удаляет исходный список

a = [1,2,3,4,5,6,7,8]
print(id(a))
print(id(a[:]))
for i in a[:]:
    if i>5:
        pass
    else:
        a.remove(i)
    print(a)
print('-----------')
print(id(a))

#filter
a=[1,2,3,4,5,6,7,8]
b = filter(lambda x: x>5,a)
print(list(b))

понимание списка

a=[1,2,3,4,5,6,7,8]
b = [i for i in a if i>5]
print(b)

удалить в обратном порядке Поскольку список всегда «перемещается вперед», его можно просматривать в обратном порядке.Даже если элементы позади изменены, элементы и их координаты, которые не были пройдены, остаются неизменными.

a=[1,2,3,4,5,6,7,8]
print(id(a))
for i in range(len(a)-1,-1,-1):
    if a[i]>5:
        pass
    else:
        a.remove(a[i])
print(id(a))
print('-----------')
print(a)

43 вопроса о работе со строками

Полнобуквенное короткое предложение PANGRAM — это предложение, содержащее все английские буквы, например: A QUICK BROWN FOX JUMPS OVER THE LAZY DOG. Определите и реализуйте метод get_missing_letter, передайте строковый приемочный номер и верните строку параметра в PANGRAM. недостающие символы. Регистр во входящих строковых аргументах следует игнорировать, возвращаемые значения должны быть строчными и отсортированы по алфавиту (пожалуйста, игнорируйте все символы, отличные от ACSII).

Следующий пример приведен для пояснения, двойные кавычки не нужно учитывать:

(0) Вход: "Быстрый коричневый для прыжков через ленивую собаку"

возвращение: ""

(1) Исходные данные: «Медленная желтая лиса ползет под активной собакой».

возвращает: "bjkmqz"

(2) Ввод: «Львы, и тигры, и медведи, о боже!»

возвращает: "cfjkpquvwxz"

(3) Ввод: ""

Возвращает: "abcdefghijklmnopqrstuvwxyz"

def get_missing_letter(a):
    s1 = set("abcdefghijklmnopqrstuvwxyz")
    s2 = set(a)
    ret = "".join(sorted(s1-s2))
    return ret
    
print(get_missing_letter("python"))

44 Изменяемые и неизменяемые типы

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

2. Когда выполняется операция модификации, тип переменной передает адрес в памяти, то есть прямое изменение значения в памяти не открывает новую память.

3. При изменении неизменяемого типа значение в исходном адресе памяти не изменяется, но открывается новая память, значение в исходном адресе копируется, а значение во вновь открытой памяти обрабатывается.

45 В чем разница между is и ==?

есть: Сравнение заключается в том, равны ли значения идентификаторов двух объектов, то есть являются ли два объекта одним и тем же экземпляром объекта. указывают на один и тот же адрес памяти

== : Если содержимое/значение двух сравниваемых объектов равно, метод eq() объекта будет вызываться по умолчанию.

46 Найдите все нечетные числа в списке и создайте новый список

a = [1,2,3,4,5,6,7,8,9,10]
res = [ i for i in a if i%2==1]
print(res)

47 Напишите 1+2+3+10248 одной строкой кода Python

from functools import reduce
#1.使用sum内置求和函数
num = sum([1,2,3,10248])
print(num)
#2.reduce 函数
num1 = reduce(lambda x,y :x+y,[1,2,3,10248])
print(num1)

48 Область действия переменных в Python? (переменный порядок поиска)

LEGB порядок области действия

1. Что такое ЛЕГБ?

L: внутренняя область локальной функции

E: Внутри объемлющей функции и между вложенными функциями

G: глобальная глобальная область

B: встроенный встроенный

Поиск Python в функциях делится на 4 типа, которые называются LEGB, и они ищутся в соответствии с этим порядком.

49 струн"123"преобразовать в123, без использования встроенного API, например.int()

Способ 1: Использованиеstrфункция

def atoi(s):
    num = 0
    for v in s:
        for j in range(10):
            if v == str(j):
                num = num * 10 + j
    return num

Способ 2: Использованиеordфункция

def atoi(s):
    num = 0
    for v in s:
        num = num * 10 + ord(v) - ord('0')
    return num

Способ 3: Использованиеevalфункция

def atoi(s):
    num = 0
    for v in s:
        t = "%s * 1" % v
        n = eval(t)
        num = num * 10 + n
    return num

Метод 4: В сочетании с методом 2 используйтеreduce, однострочное решение

from functools import reduce
def atoi(s):
    return reduce(lambda num, v: num * 10 + ord(v) - ord('0'), s, 0)

50 Given an array of integers

Учитывая массив целых чисел и целевое значение, найдите в массиве два числа, сумма которых равна целевому значению. Вы можете предположить, что каждый ввод соответствует только одному ответу и что одни и те же элементы нельзя использовать повторно. Пример: Даны nums = [2,7,11,15],target=9, потому что nums[0]+nums[1] = 2+7 =9, поэтому верните [0,1]

class Solution:
    def twoSum(self,nums,target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: List[int]
        """
        d = {}
        size = 0
        while size < len(nums):
            if target-nums[size] in d:
                if d[target-nums[size]] <size:
                    return [d[target-nums[size]],size]
                else:
                    d[nums[size]] = size
                size = size +1
solution = Solution()
list = [2,7,11,15]
target = 9
nums = solution.twoSum(list,target)
print(nums)

Отсортируйте словарь в списке: Предположим, есть следующий объект списка, alist=[{"name":"a","age":20},{"name":"b","age":30}, {" name":"c","age":25}], отсортируйте элементы списка в порядке убывания возраста alist=[{"name":"a","age":20},{"name " :"б","возраст":30},{"имя":"с","возраст":25}]

alist_sort = sorted(alist,key=lambda e: e.__getitem__('age'),reverse=True)

51 код Python для удаления повторяющихся элементов в списке

def distFunc1(a):
    """使用集合去重"""
    a = list(set(a))
    print(a)

def distFunc2(a):
    """将一个列表的数据取出放到另一个列表中,中间作判断"""
    list = []
    for i in a:
        if i not in list:
            list.append(i)
    #如果需要排序的话用sort
    list.sort()
    print(list)

def distFunc3(a):
    """使用字典"""
    b = {}
    b = b.fromkeys(a)
    c = list(b.keys())
    print(c)

if __name__ == "__main__":
    a = [1,2,4,2,4,5,7,10,5,5,7,8,9,0,3]
    distFunc1(a)
    distFunc2(a)
    distFunc3(a)
  

52 Подсчитайте 10 слов с наибольшей частотностью в тексте?

import re

# 方法一
def test(filepath):
    
    distone = {}

    with open(filepath) as f:
        for line in f:
            line = re.sub("\W+", " ", line)
            lineone = line.split()
            for keyone in lineone:
                if not distone.get(keyone):
                    distone[keyone] = 1
                else:
                    distone[keyone] += 1
    num_ten = sorted(distone.items(), key=lambda x:x[1], reverse=True)[:10]
    num_ten =[x[0] for x in num_ten]
    return num_ten
    
 
# 方法二 
# 使用 built-in 的 Counter 里面的 most_common
import re
from collections import Counter


def test2(filepath):
    with open(filepath) as f:
        return list(map(lambda c: c[0], Counter(re.sub("\W+", " ", f.read()).split()).most_common(10)))

53 Пожалуйста, напишите функцию, удовлетворяющую следующим условиям

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

1. Элемент является четным числом

2. Элемент находится на четной позиции в исходном списке (индекс — четное число)

def num_list(num):
    return [i for i in num if i %2 ==0 and num.index(i)%2==0]

num = [0,1,2,3,4,5,6,7,8,9,10]
result = num_list(num)
print(result)

54 Используйте одно понимание списка для создания нового списка

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

list_data = [1,2,5,8,10,3,18,6,20]
res = [x for x in list_data[::2] if x %2 ==0]
print(res)

55 Сгенерируйте [1,4,9,16,25,36,49,64,81,100] с помощью одной строки кода

[x * x for x in range(1,11)]

56 Введите определенный месяц и определенный день определенного года и определите, какого дня года этот день?

import datetime

y = int(input("请输入4位数字的年份:"))
m = int(input("请输入月份:"))
d = int(input("请输入是哪一天"))

targetDay = datetime.date(y,m,d)
dayCount = targetDay - datetime.date(targetDay.year -1,12,31)
print("%s是 %s年的第%s天。"%(targetDay,y,dayCount.days))

57 Два упорядоченных списка, l1, l2, не могут использовать расширение для объединения этих двух списков.

def loop_merge_sort(l1,l2):
    tmp = []
    while len(l1)>0 and len(l2)>0:
        if l1[0] <l2[0]:
            tmp.append(l1[0])
            del l1[0]
        else:
            tmp.append(l2[0])
            del l2[0]
    while len(l1)>0:
        tmp.append(l1[0])
        del l1[0]
    while len(l2)>0:
        tmp.append(l2[0])
        del l2[0]
    return tmp

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

Пусть все нечетные числа стоят перед четными числами, и нечетные числа сортируются в порядке возрастания, а четные числа сортируются в порядке убывания, например, строка «1982376455», которая становится «1355798642».

# 方法一
def func1(l):
    if isinstance(l, str):
        l = [int(i) for i in l]
    l.sort(reverse=True)
    for i in range(len(l)):
        if l[i] % 2 > 0:
            l.insert(0, l.pop(i))
    print(''.join(str(e) for e in l))

# 方法二
def func2(l):
    print("".join(sorted(l, key=lambda x: int(x) % 2 == 0 and 20 - int(x) or int(x))))

59 Напишите функцию для поиска второго по величине числа в массиве целых чисел.

def find_second_large_num(num_list):
    """
    找出数组第2大的数字
    """
    # 方法一
    # 直接排序,输出倒数第二个数即可
    tmp_list = sorted(num_list)
    print("方法一\nSecond_large_num is :", tmp_list[-2])
    
    # 方法二
    # 设置两个标志位一个存储最大数一个存储次大数
    # two 存储次大值,one 存储最大值,遍历一次数组即可,先判断是否大于 one,若大于将 one 的值给 two,将 num_list[i] 的值给 one,否则比较是否大于two,若大于直接将 num_list[i] 的值给two,否则pass
    one = num_list[0]
    two = num_list[0]
    for i in range(1, len(num_list)):
        if num_list[i] > one:
            two = one
            one = num_list[i]
        elif num_list[i] > two:
            two = num_list[i]
    print("方法二\nSecond_large_num is :", two)
    
    # 方法三
    # 用 reduce 与逻辑符号 (and, or)
    # 基本思路与方法二一样,但是不需要用 if 进行判断。
    from functools import reduce
    num = reduce(lambda ot, x: ot[1] < x and (ot[1], x) or ot[0] < x and (x, ot[1]) or ot, num_list, (0, 0))[0]
    print("方法三\nSecond_large_num is :", num)
    
    
if __name__ == '__main___':
    num_list = [34, 11, 23, 56, 78, 0, 9, 12, 3, 7, 5]
    find_second_large_num(num_list)

60 Прочитайте код, что они выводят?

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

Правильный ответ: [9,9,9,9], а не [0,3,6,9]. Причиной этого является позднее связывание замыканий Python, что означает, что переменные в замыкании перебираются, когда внутренняя функция вызывается, потому что когда вызывается последняя функция, цикл for завершен, и значение i, наконец, равно 3, поэтому i каждого возвращаемого значения равно 3, поэтому окончательный результат [9, 9,9 ,9]

61 Подсчитать количество вхождений символов в строку

# 方法一
def count_str(str_data):
    """定义一个字符出现次数的函数"""
    dict_str = {} 
    for i in str_data:
        dict_str[i] = dict_str.get(i, 0) + 1
    return dict_str
dict_str = count_str("AAABBCCAC")
str_count_data = ""
for k, v in dict_str.items():
    str_count_data += k + str(v)
print(str_count_data)

# 方法二
from collections import Counter

print("".join(map(lambda x: x[0] + str(x[1]), Counter("AAABBCCAC").most_common())))

62 В чем разница между методами класса, методами экземпляра класса и статическими методами в Python?

Метод класса: это метод объекта класса. Он должен быть украшен @classmethod выше, когда он определен. Формальный параметр - cls, что означает, что объект класса, объект класса и объект экземпляра могут быть вызваны

Метод экземпляра класса: это метод создания экземпляра объекта класса, можно вызывать только объект экземпляра, а формальным параметром является self, который относится к самому объекту;

Статический метод: это произвольная функция, украшенная @staticmethod над ней, и может быть вызвана непосредственно с объектом.Статические методы не имеют ничего общего с этим классом.

63 Пройтись по всем атрибутам объекта и вывести имя каждого атрибута?

class Car:
    def __init__(self,name,loss): # loss [价格,油耗,公里数]
        self.name = name
        self.loss = loss
    
    def getName(self):
        return self.name
    
    def getPrice(self):
        # 获取汽车价格
        return self.loss[0]
    
    def getLoss(self):
        # 获取汽车损耗值
        return self.loss[1] * self.loss[2]

Bmw = Car("宝马",[60,9,500]) # 实例化一个宝马车对象
print(getattr(Bmw,"name")) # 使用getattr()传入对象名字,属性值。
print(dir(Bmw)) # 获Bmw所有的属性和方法

64 Написать класс, поддерживающий как можно больше операторов?

class Array:
    __list = []
    
    def __init__(self):
        print "constructor"
    
    def __del__(self):
        print "destruct"
    
    def __str__(self):
        return "this self-defined array class"

    def __getitem__(self,key):
        return self.__list[key]
    
    def __len__(self):
        return len(self.__list)

    def Add(self,value):
        self.__list.append(value)
    
    def Remove(self,index):
        del self.__list[index]
    
    def DisplayItems(self):
        print "show all items---"
        for item in self.__list:
            print item
    
        

65 Что касается управления памятью Python, какое из следующих утверждений неверно: B

A, переменные не нужно объявлять заранее B, переменные можно использовать напрямую без предварительного создания и присвоения

C, в переменной не нужно указывать тип D, для освобождения ресурсов можно использовать del

66 Механизм управления памятью Python и методы настройки?

Механизмы управления памятью: подсчет ссылок, сборка мусора, пулы памяти

Подсчет ссылок: подсчет ссылок — очень эффективный метод управления памятью.Когда на объект Python ссылаются, его счетчик ссылок увеличивается на 1.

Счетчик уменьшается на 1, когда на него больше не ссылается переменная, и объект удаляется, когда счетчик ссылок становится равным 0. Слабые ссылки не увеличивают количество ссылок

Вывоз мусора:

1. Подсчет ссылок

Подсчет ссылок также является механизмом сборки мусора, а также одним из самых интуитивно понятных и простых методов сборки мусора. Когда счетчик ссылок на объект в Python падает до 0, это означает, что ссылки на объект нет, и объект становится мусором, который нужно собрать. Например, если новый объект назначается ссылке, счетчик ссылок объекта становится равным 1. Если ссылка удалена, а счетчик ссылок объекта равен 0, объект может быть удален сборщиком мусора. Однако при наличии циклической ссылки механизм подсчета ссылок уже не играет эффективной роли.

2. Отметить как очищенный

Тюнинговые средства

1. Ручная сборка мусора

2. Увеличьте порог сбора мусора

3. Избегайте циклических ссылок

67 Что такое утечка памяти? Как этого избежать?

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

имеют__del__()Циклические ссылки между функциональными объектами являются основными виновниками утечек памяти. Если объект не используется, используйте: del object для удаления счетчика ссылок объекта, что может эффективно предотвратить утечку памяти.

Используйте модуль расширения Python gc для просмотра сведений об объектах, которые нельзя переработать.

Вы можете получить количество ссылок на объект через sys.getrefcount(obj) и судить о том, происходит ли утечка памяти, в зависимости от того, равно ли возвращаемое значение 0

68 Понимание общего списка Python?

[выражение для переменной в списке] или [выражение для переменной в списке, если условие]

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

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

readline читает следующую строку

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

70 Что такое Hash (хэш-функция)?

хэш-функция(английский: хэш-функция), также известная какхеш-алгоритм,хэш-функция, — это способ создать небольшой цифровой «отпечаток пальца» из любых данных. Хэш-функция сжимает сообщение или данные в дайджест, уменьшая объем данных и фиксируя формат данных. Эта функция перемешивает данные и воссоздаетхэш-значение(хэш-значения, хэш-коды, хеш-суммы или хэши) отпечатки пальцев. Хэш-значение обычно представлено короткой строкой случайных букв и цифр.

71 Механизм перегрузки функций Python?

Перегрузка функций предназначена в основном для решения двух проблем. 1. Тип переменной параметра. 2. Переменное количество параметров.

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

Итак, для случая 1 функция делает то же самое, но типы параметров другие, как с этим справляется python? Ответ заключается в том, что его вообще не нужно обрабатывать, потому что python может принимать параметры любого типа.Если функция функции одинакова, то разные типы параметров, вероятно, будут одним и тем же кодом в python, и нет необходимости делать две разные функции.

Итак, для случая 2 функция та же, но количество параметров другое, как с этим справляется python? Как мы все знаем, ответом являются параметры по умолчанию. Установка этих отсутствующих параметров на параметры по умолчанию решит проблему. Поскольку вы предполагаете, что функции делают одно и то же, эти отсутствующие параметры в конце концов необходимы.

Ну, так как оба случая 1 и 2 имеют решения, python, естественно, не нуждается в перегрузке функций.

72 Рукописный декоратор, который судит время

import datetime


class TimeException(Exception):
    def __init__(self, exception_info):
        super().__init__()
        self.info = exception_info

    def __str__(self):
        return self.info


def timecheck(func):
    def wrapper(*args, **kwargs):
        if datetime.datetime.now().year == 2019:
            func(*args, **kwargs)
        else:
            raise TimeException("函数已过时")

    return wrapper


@timecheck
def test(name):
    print("Hello {}, 2019 Happy".format(name))


if __name__ == "__main__":
    test("backbp")

73 Использовать для фильтрации встроенный в Python метод filter()?

list(filter(lambda x: x % 2 == 0, range(10)))

74 4 принципа написания функций

1. Дизайн функции должен быть как можно короче

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

3. При проектировании функциональных параметров следует учитывать обратную совместимость.

4. Функция делает только одну вещь, постарайтесь обеспечить согласованность детализации оператора функции.

75 Параметры вызова функции передаются по значению или по ссылке?

Передача параметров Python включает в себя: позиционные параметры, параметры по умолчанию, переменные параметры и параметры ключевых слов.

Передается ли значение функции по значению или по ссылке, зависит от ситуации:

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

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

76 Как установить глобальную переменную внутри функции

globals() # 返回包含当前作用余全局变量的字典。
global 变量 设置使用全局变量

77 Понимание параметров по умолчанию?

Параметр по умолчанию относится к вызову параметра по умолчанию, когда при вызове функции не передается параметр.Когда функция вызывается и присваивается значение, переданный параметр заменяет параметр по умолчанию.

*args — это параметр переменной длины, который может указывать на то, что входные параметры не определены и могут быть любым числом.

**kwargs — параметр ключевого слова. При назначении он представлен в виде пары ключ-значение. Параметр может быть любым количеством пар. При определении функции

Если вы не уверены, сколько параметров будет передано, вы можете использовать два параметра

78 Декораторы с параметрами?

Декоратор с параметром фиксированной длины

def new_func(func):
    def wrappedfun(username, passwd):
        if username == 'root' and passwd == '123456789':
            print('通过认证')
            print('开始执行附加功能')
            return func()
       	else:
            print('用户名或密码错误')
            return
    return wrappedfun

@new_func
def origin():
    print('开始执行函数')
origin('root','123456789')

Декоратор с параметром переменной длины

def new_func(func):
    def wrappedfun(*parts):
        if parts:
            counts = len(parts)
            print('本系统包含 ', end='')
            for part in parts:
                print(part, ' ',end='')
            print('等', counts, '部分')
            return func()
        else:
            print('用户名或密码错误')
            return func()
   return wrappedfun

79 Почему имена функций могут использоваться в качестве параметров?

Все в Python — это объект, а имя функции — это пространство функции в памяти, и это тоже объект

80 Какова цель оператора pass в Python?

При написании кода пишется только идея фреймворка, а конкретная реализация может занимать место без написания, программа не сообщит об ошибке и не выполнит никаких операций.

81 С таким фрагментом кода, что выведет вывод c и почему?

a = 10
b = 20
c = [a]
a = 15

Ответ: 10 Для строк, чисел проход является соответствующим значением

82 Поменять местами значения двух переменных?

a, b = b, a

83 функция карты и функция уменьшения?

map(lambda x: x * x, [1, 2, 3, 4])   # 使用 lambda
# [1, 4, 9, 16]
reduce(lambda x, y: x * y, [1, 2, 3, 4])  # 相当于 ((1 * 2) * 3) * 4
# 24

84 Функция обратного вызова, как связаться?

Функция обратного вызова предназначена для передачи указателя (адреса) функции в качестве параметра другой функции, обработки всей функции как объекта и присвоения ее вызываемой функции.

85 Каковы основные встроенные типы данных Python? Вывод print dir('a') ?

Встроенные типы: логические значения, числа, строки, списки, кортежи, словари, наборы.

Встроенный метод вывода строки 'a'

86 Вывод карты (лямбда x:xx, [y для y в диапазоне (3)])?

[0, 1, 4]

87 Подробное объяснение использования функции hasattr() getattr() setattr()?

функция hasattr(объект,имя):

Определяет, имеет ли объект атрибут имени или метод имени, возвращает логическое значение и возвращает True, если есть атрибут имени (метод), в противном случае возвращает False.

class function_demo(object):
    name = 'demo'
    def run(self):
        return "hello function"
functiondemo = function_demo()
res = hasattr(functiondemo, "name") # 判断对象是否有name属性,True
res = hasattr(functiondemo, "run") # 判断对象是否有run方法,True
res = hasattr(functiondemo, "age") # 判断对象是否有age属性,False
print(res)

getattr(объект, имя[по умолчанию]):

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

functiondemo = function_demo()
getattr(functiondemo, "name")# 获取name属性,存在就打印出来 --- demo
getattr(functiondemo, "run") # 获取run 方法,存在打印出方法的内存地址
getattr(functiondemo, "age") # 获取不存在的属性,报错
getattr(functiondemo, "age", 18)# 获取不存在的属性,返回一个默认值

setattr(объект, имя, значения) функция:

Присвойте значение свойству объекта, если свойство не существует, сначала создайте его, а затем присвойте

class function_demo(object):
    name = "demo"
    def run(self):
        return "hello function"
functiondemo = function_demo()
res = hasattr(functiondemo, "age") # 判断age属性是否存在,False
print(res)
setattr(functiondemo, "age", 18) # 对age属性进行赋值,无返回值
res1 = hasattr(functiondemo, "age") # 再次判断属性是否存在,True

Комплексное использование

class function_demo(object):
    name = "demo"
    def run(self):
        return "hello function"
functiondemo = function_demo()
res = hasattr(functiondemo, "addr") # 先判断是否存在
if res:
    addr = getattr(functiondemo, "addr")
    print(addr)
else:
    addr = getattr(functiondemo, "addr", setattr(functiondemo, "addr", "北京首都"))
    print(addr)

88 Решите факториальную функцию одним предложением?

reduce(lambda x,y : x*y,range(1,n+1))

89 Понимание шаблонов проектирования, кратко опишите шаблоны проектирования, которые вы знаете?

Шаблоны проектирования — это обобщенные, оптимизированные, многократно используемые решения некоторых проблем программирования, с которыми мы часто сталкиваемся. Паттерн проектирования не воздействует непосредственно на наш код, как класс или библиотека, напротив, паттерн проектирования более продвинутый, это шаблон метода, который необходимо реализовать в конкретной ситуации. Распространенными являются шаблон factory и шаблон singleton.

90 Пожалуйста, напишите синглтон от руки

#python2
class A(object):
    __instance = None
    def __new__(cls,*args,**kwargs):
        if cls.__instance is None:
            cls.__instance = objecet.__new__(cls)
            return cls.__instance
        else:
            return cls.__instance

91 Каковы сценарии применения одноэлементного шаблона?

Сценарии, в которых применяется одноэлементный шаблон, обычно встречаются при следующих условиях: В случае совместного использования ресурсов избегайте производительности или потерь, вызванных операциями с ресурсами, такими как файлы журналов и конфигурация приложений. В случае управления ресурсами удобно общаться друг с другом между ресурсами. Например, пулы потоков и т. д. 1, счетчик веб-сайта 2, конфигурация приложения 3. Многопоточный пул 4 пул соединений с базой данных конфигурации базы данных 5. Приложение журнала приложений...

92 Сгенерируйте [1,4,9,16,25,36,49,64,81,100] с помощью одной строки кода

print([x*x for x in range(1, 11)])

93 Понять декоратор и написать декоратор, который записывает выполнение таймера?

Декоратор — это, по сути, вызываемый объект, который позволяет другим функциям добавлять дополнительные функции без каких-либо изменений в коде.Возвращаемое значение декоратора также является объектом функции.

import time
from functools import wraps

def timeit(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        start = time.clock()
        ret = func(*args, **kwargs)
        end = time.clock()
        print('used:',end-start)
        return ret
    
    return wrapper
@timeit
def foo():
    print('in foo()'foo())

94 Объясните, что такое замыкание?

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

95 Что делает декоратор функции?

Декоратор — это, по сути, вызываемый объект, который позволяет другим функциям добавлять дополнительные функции, не требуя каких-либо изменений кода. Возвращаемое значение декоратора также является функциональным объектом, который часто используется в сценариях с требованиями к аспекту. Например: вставка журнала, тест производительности, обработка транзакций, кеш. В таких сценариях, как проверка разрешений, с помощью декоратора можно извлечь и использовать одновременно большое количество похожих кодов, не связанных с самой функцией. Подробная ссылка:Manjusaka.ITS coder.com/2018/02/23/…

96 В чем разница между генератором и итератором?

Итераторы — это объекты, которые следуют протоколу итерации. Пользователи могут использовать iter() для получения итераторов из любой последовательности (например, списка, кортежа, словаря, набора и т. д.). Другой способ — создать другую форму итератора — генератор. Чтобы получить следующий элемент, используйте функцию-член next() (Python 2) или функцию next() (Python 3). Это исключение вызывается StopIteration при отсутствии элементов. Чтобы реализовать свой собственный итератор, просто реализуйте next() (Python 2) или__next__() (Питон 3)

Генератор (Generator), просто используйте оператор yield, когда вам нужно вернуть данные. Каждый раз, когда вызывается next(), генератор возвращает то место, на котором он остановился (он запоминает, где в последний раз выполнялся оператор, и все значения данных).

Отличие: генераторы могут делать все то же, что и итераторы, и из-за автоматического создания методов iter() и next() генераторы особенно лаконичны, а генераторы также эффективны, использование выражений генератора вместо понимания списка также может сэкономить память. В дополнение к автоматическим методам создания и сохранения состояния программы при завершении работы генератора автоматически создается исключение StopIteration.

Какой тип 97 X?

X= (i для i в диапазоне (10)) X - тип генератора

98 Используйте одну строку кода, чтобы реализовать группировку 1-N целочисленных списков в блоках по 3

N =100
print ([[x for x in range(1,100)] [i:i+3] for i in range(0,100,3)])

99 Использование yield в Python?

yield — сохранить текущее состояние выполнения программы. Когда вы используете цикл for, он вычисляется каждый раз, когда вы берете элемент. Функция, которая использует yield, называется генератором.Как и итератор, ее преимущество в том, что ей не нужно вычислять все элементы за раз, а вычисляет их один раз, что может сэкономить много места.Генератору нужен результат предыдущего вычисления для каждого вычисление, поэтому используйте yield, иначе return , последний результат вычисления исчезнет