Самый полный пример Python во всей сети (с исходным кодом)

Python

исходный код

GitHub.com/Java Difficulty/Пак Ючон…

Попрощайтесь со скучностью, изучите небольшой пример за 60 секунд, систематически изучайте Python, от начального уровня до мастера.Дорога ПитонаПримеров уже 190:

Глава 0: Почувствуйте красоту Python

Глава 1: Основы Python

Глава 2: Яма Питона

Глава 3: Строки Python и регулярные выражения

Глава 4: Файлы Python

Глава 5: Даты Python

Глава 6: Инструмент Python

Глава 7: Рисование Python

Глава 8: Python в действии

Глава 9: Основные алгоритмы Python

Глава 10: Машинное обучение Python

Последующие главы:

  1. Продолжайте обогащать исходные главы 1-7;
  2. базовый алгоритм Python;
  3. Машинное обучение Python, включая основные концепции машинного обучения и десять основных алгоритмов, а также небольшие примеры боя Sklearn и Kaggle.
  4. PyQt для создания графического интерфейса
  5. Фронтенд разработка Flask
  6. Анализ данных Python: NumPy, Pandas, Matplotlib, Plotly и т. д.

послал«Дорога к Python.1.1.pdf»Последняя версия включает 7 глав:Python基础,Python字符串和正则,Python文件,Python日期, Python利器,Python画图Главы, всего147个Маленький пример.

Почувствуйте красоту Python

1 Красота простоты

С помощью строки кода ощутите красоту простоты языка Python.

  1. Одна строка обмена кодамиa,b:
a, b = b, a
  1. Одна строка кода, чтобы перевернуть список
[1,2,3][::-1] # [3,2,1]
  1. Одна строка кода для объединения двух словарей
{**{'a':1,'b':2}, **{'c':3}} # {'a': 1, 'b': 2, 'c': 3}

  1. Одна строка дедупликации списка кода
set([1,2,2,3,3,3]) # {1, 2, 3}
  1. Одна строка кода для поиска максимального значения в нескольких списках
max(max([ [1,2,3], [5,1], [4] ], key=lambda v: max(v))) # 5
  1. Одна строка кода для генерации обратной последовательности
list(range(10,-1,-1)) # [10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0]

2 Графики Python

Рисование на Python удобно и красиво, а графические диаграммы артефактов рисования могут рисовать тепловую карту с помощью нескольких строк кода:

image.png

Крутая карта водного поло:

image.png

Часто используемые диаграммы облака слов:

image.png

3 Python анимация

Применяется только к общей библиотеке рисования Python: Matplotlib, которая может создавать анимацию и помогать начинающим алгоритмам приступить к работе с базовыми алгоритмами сортировки. Ниже приведена случайная последовательность, использующая快速排序算法, анимация процесса сортировки от мелкого к крупному:

image.png

Отображение анимации сортировки слиянием:

image.png

Снежинки, нарисованные с помощью черепахи:

image.png

4 Анализ данных Python

Python очень удобен для численных расчетов и анализа данных.Одна строка кода завершает представление данных:

pd.pivot_table(df, index=['Manager', 'Rep'], values=['Price'], aggfunc=np.sum)

5 Машинное обучение Python

Библиотека машинного обучения PythonSklearnМощные функции и простые в использовании интерфейсы, включая модули предварительной обработки данных, регрессию, классификацию, кластеризацию, уменьшение размерности и т. д. Одна строка кода для создания модели кластеризации KMeans:

from sklearn.cluster import KMeans
KMeans( n_clusters=3 )

image.png

6 Python-GUI

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

Кроме того, также очень удобно использовать фреймворк Python Flask для создания веб-фреймворка.

Во всяком случае, в этомPython小例子, можно узнать интересные небольшие примеры обо всех аспектах работы с Python, прошу обратить внимание.

1. Основы Python

Python基础В основном обобщает часто используемые встроенные функции Python, уникальные особенности синтаксиса и ключевые слова Python.nonlocal, globalи т. д.; встроенные структуры данных включают в себя: список (list), словарь (dict), набор (set), кортеж (tuple) и связанные с ними расширенные модулиcollectionsсерединаCounter, namedtuple, defaultdict,heapqмодуль. В настоящее время есть82небольшой пример

Эта глава включает в себя в общей сложности82个Базовый небольшой пример.

1 Найдите абсолютное значение

модуль абсолютных или комплексных чисел

In [1]: abs(-6)
Out[1]: 6

2 элемента верны

принимает итератор, если итератор所有元素все верно, то вернитесьTrue, иначе возвратFalse

In [2]: all([1,0,3,6])
Out[2]: False

In [3]: all([1,2,3])
Out[3]: True

3 элемента хотя бы один верный 

принимает итератор, если итератор至少有一个элемент истинен, затем возвратTrue, иначе возвратFalse

In [4]: any([0,0,0,[]])
Out[4]: False

In [5]: any([0,0,1])
Out[5]: True

4 объекта отображения ascii  

Вызовите метод __repr__() объекта, чтобы получить возвращаемое значение метода.В следующем примере возвращаемое значение представляет собой строку

In [1]: class Student():
   ...:     def __init__(self,id,name):
   ...:         self.id = id
   ...:         self.name = name
   ...:     def __repr__(self):
   ...:         return 'id = '+self.id +', name = '+self.name
   ...: 
   ...: 

In [2]: xiaoming = Student(id='001',name='xiaoming')

In [3]: print(xiaoming)
id = 001, name = xiaoming

In [4]: ascii(xiaoming)
Out[4]: 'id = 001, name = xiaoming'

5 десять очередь два

будет十进制преобразовать в二进制

In [1]: bin(10)
Out[1]: '0b1010'

6 десять очередь восемь

будет十进制преобразовать в八进制

In [1]: oct(9)
Out[1]: '0o11'

7 десять поворот шестнадцать

будет十进制преобразовать в十六进制

In [1]: hex(15)
Out[1]: '0xf'

8 Суждение истинно или ложно  

Проверяет, является ли объект True или False.

In [1]: bool([0,0,0])
Out[1]: True

In [2]: bool([])
Out[2]: False

In [3]: bool([1,0,1])
Out[3]: True

9 Строка в байт  

положить字符串преобразовать в字节тип

In [1]: s = "apple"

In [2]: bytes(s,encoding='utf-8')
Out[2]: b'apple'

10 Преобразовать в строку   

будет字符类型,数值类型и т. д., чтобы преобразовать в字符串тип

In [1]: i = 100

In [2]: str(i)
Out[2]: '100'

11 Можно ли позвонить   

Определить, может ли объект быть вызван, объект, который может быть вызван, являетсяcallableобъекты, такие как функцииstr, intи т. д. все можно вызывать, но пример4серединаxiaomingЭкземпляры не вызываются:

In [1]: callable(str)
Out[1]: True

In [2]: callable(int)
Out[2]: True

In [3]: xiaoming
Out[3]: id = 001, name = xiaoming

In [4]: callable(xiaoming)
Out[4]: False

Если хотитеxiaomingМожно вызвать xiaoming(), нужно переписатьStudentКатегория__call__метод:

In [1]: class Student():
    ...:     def __init__(self,id,name):
    ...:         self.id = id
    ...:         self.name = name
    ...:     def __repr__(self):
    ...:         return 'id = '+self.id +', name = '+self.name
    ...:     def __call__(self):
    ...:         print('I can be called')
    ...:         print(f'my name is {self.name}')
    ...: 
    ...: 

In [2]: t = Student('001','xiaoming')

In [3]: t()
I can be called
my name is xiaoming

12 десять в ASCII

Просмотр соответствующего десятичного целого числаASCII字符

In [1]: chr(65)
Out[1]: 'A'

13 ASCII до десяти

просмотретьASCII字符соответствующее десятичное число

In [1]: ord('A')
Out[1]: 65

14 статических методов 

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

In [1]: class Student():
    ...:     def __init__(self,id,name):
    ...:         self.id = id
    ...:         self.name = name
    ...:     def __repr__(self):
    ...:         return 'id = '+self.id +', name = '+self.name
    ...:     @classmethod
    ...:     def f(cls):
    ...:         print(cls)

15 Выполнить код, представленный строкой

Скомпилируйте строку в код, который python может распознать или выполнить, или прочитайте текст в строку и скомпилируйте его.

In [1]: s  = "print('helloworld')"
    
In [2]: r = compile(s,"<string>", "exec")
    
In [3]: r
Out[3]: <code object <module> at 0x0000000005DE75D0, file "<string>", line 1>
    
In [4]: exec(r)
helloworld

16 Создание комплексных чисел

создать множественное число

In [1]: complex(1,2)
Out[1]: (1+2j)

17 Динамическое удаление атрибутов  

удалить свойство объекта

In [1]: delattr(xiaoming,'id')

In [2]: hasattr(xiaoming,'id')
Out[2]: False

18 Преобразовать в словарь  

Создать словарь данных

In [1]: dict()
Out[1]: {}

In [2]: dict(a='a',b='b')
Out[2]: {'a': 'a', 'b': 'b'}

In [3]: dict(zip(['a','b'],[1,2]))
Out[3]: {'a': 1, 'b': 2}

In [4]: dict([('a',1),('b',2)])
Out[4]: {'a': 1, 'b': 2}

19 Просмотр всех методов объекта одним щелчком мыши 

вернуть без аргументов当前范围Список переменных, методов и типов, определенных внутри; возвращается с аргументами参数список свойств и методов.

In [96]: dir(xiaoming)
Out[96]:
['__class__',
 '__delattr__',
 '__dict__',
 '__dir__',
 '__doc__',
 '__eq__',
 '__format__',
 '__ge__',
 '__getattribute__',
 '__gt__',
 '__hash__',
 '__init__',
 '__init_subclass__',
 '__le__',
 '__lt__',
 '__module__',
 '__ne__',
 '__new__',
 '__reduce__',
 '__reduce_ex__',
 '__repr__',
 '__setattr__',
 '__sizeof__',
 '__str__',
 '__subclasshook__',
 '__weakref__',
 
 'name']

20 Частное и остаток  

Возьмем частное и остаток отдельно

In [1]: divmod(10,3)
Out[1]: (3, 1)

21 Объект перечисления  

Возвращает перечисляемый объект, метод next() которого возвращает кортеж.

In [1]: s = ["a","b","c"]
    ...: for i ,v in enumerate(s,1):
    ...:     print(i,v)
    ...:
1 a
2 b
3 c

22 Расчетные выражения

Оцените строку str как допустимое выражение и верните результат оценки, чтобы извлечь содержимое строки.

In [1]: s = "1 + 3 +5"
    ...: eval(s)
    ...:
Out[1]: 9

23 Просмотр количества байтов, занимаемых переменными

In [1]: import sys

In [2]: a = {'a':1,'b':2.0}

In [3]: sys.getsizeof(a) # 占用240个字节
Out[3]: 240

24 фильтра  

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

In [1]: fil = filter(lambda x: x>10,[1,11,2,45,7,6,13])

In [2]: list(fil)
Out[2]: [11, 45, 13]

25 Преобразование в тип с плавающей запятой 

Преобразует целую или числовую строку в число с плавающей запятой

In [1]: float(3)
Out[1]: 3.0

Если его нельзя преобразовать в число с плавающей запятой, он сообщитValueError:

In [2]: float('a')
ValueError                                Traceback (most recent call last)
<ipython-input-11-99859da4e72c> in <module>()
----> 1 float('a')

ValueError: could not convert string to float: 'a'

26 Форматирование строк 

Для форматирования выходной строки format(value, format_spec) по существу вызывает метод значения __format__(format_spec).

In [104]: print("i am {0},age{1}".format("tom",18))
i am tom,age18
3.1415926 {:.2f} 3.14 два десятичных знака
3.1415926 {:+.2f} +3.14 Знак с двумя десятичными знаками
-1 {:+.2f} -1.00 Знак с двумя десятичными знаками
2.71828 {:.0f} 3 без десятичных знаков
5 {:0>2d} 05 Дополнение нулевого числа (заполнение слева, ширина 2)
5 {:x<4d} 5xxx Числа дополняют x (отступ справа, ширина равна 4)
10 {:x<4d} 10xx Числа дополняют x (отступ справа, ширина равна 4)
1000000 {:,} 1,000,000 числовой формат с разделителями-запятыми
0.25 {:.2%} 25.00% процентный формат
1000000000 {:.2e} 1.00e+09 Экспоненциальное представление
18 {:>10d} ' 18' Выровнять по правому краю (по умолчанию, ширина равна 10)
18 {:<10d} '18 ' Выровнять по левому краю (ширина 10)
18 {:^10d} ' 18 ' Выровнено по центру (ширина 10)

27 Коллекция заморозок  

Создайте неизменяемую коллекцию.

In [1]: frozenset([1,1,3,2,3])
Out[1]: frozenset({1, 2, 3})

Поскольку это не модифицируется, нет лайкаsetТакойaddиpopметод

28 Динамическое получение свойств объекта 

Получить свойства объекта

In [1]: class Student():
   ...:     def __init__(self,id,name):
   ...:         self.id = id
   ...:         self.name = name
   ...:     def __repr__(self):
   ...:         return 'id = '+self.id +', name = '+self.name

In [2]: xiaoming = Student(id='001',name='xiaoming')
In [3]: getattr(xiaoming,'name') # 获取xiaoming这个实例的name属性值
Out[3]: 'xiaoming'

29 Есть ли у объекта это свойство

In [1]: class Student():
   ...:     def __init__(self,id,name):
   ...:         self.id = id
   ...:         self.name = name
   ...:     def __repr__(self):
   ...:         return 'id = '+self.id +', name = '+self.name

In [2]: xiaoming = Student(id='001',name='xiaoming')
In [3]: hasattr(xiaoming,'name')
Out[3]: True

In [4]: hasattr(xiaoming,'address')
Out[4]: False

30 Возвращает хеш-значение объекта  

Возвращает хеш-значение объекта. Стоит отметить, что пользовательские экземпляры можно хэшировать.list, dict, setВсе изменяемые объекты нельзя хэшировать

In [1]: hash(xiaoming)
Out[1]: 6139638

In [2]: hash([1,2,3])
TypeError                                 Traceback (most recent call last)
<ipython-input-32-fb5b1b1d9906> in <module>()
----> 1 hash([1,2,3])

TypeError: unhashable type: 'list'

31 Справка в один клик 

Возвращает справочную документацию для объекта

In [1]: help(xiaoming)
Help on Student in module __main__ object:

class Student(builtins.object)
 |  Methods defined here:
 |
 |  __init__(self, id, name)
 |
 |  __repr__(self)
 |
 |  Data descriptors defined here:
 |
 |  __dict__
 |      dictionary for instance variables (if defined)
 |
 |  __weakref__
 |      list of weak references to the object (if defined)

32 Номер дома объекта 

Возвращает адрес памяти объекта

In [1]: id(xiaoming)
Out[1]: 98234208

33 Получить пользовательский ввод 

Получить пользовательский ввод

In [1]: input()
aa
Out[1]: 'aa'

34 Преобразовать в целое число   

int(x, base =10) , где x может быть строкой или числом, преобразует x в обычное целое число. Если аргумент является строкой, он может содержать символы и десятичные точки. Длинное целое возвращается, если оно находится за пределами диапазона представления обычного целого числа.

In [1]: int('12',16)
Out[1]: 18

35 isinstance

судитьobjectэто классclassinfoэкземпляр, должен вернуть true

In [1]: class Student():
   ...:     def __init__(self,id,name):
   ...:         self.id = id
   ...:         self.name = name
   ...:     def __repr__(self):
   ...:         return 'id = '+self.id +', name = '+self.name

In [2]: xiaoming = Student(id='001',name='xiaoming')

In [3]: isinstance(xiaoming,Student)
Out[3]: True

36 Идентификация отношений отца и сына

In [1]: class undergraduate(Student):
    ...:     def studyClass(self):
    ...:         pass
    ...:     def attendActivity(self):
    ...:         pass

In [2]: issubclass(undergraduate,Student)
Out[2]: True

In [3]: issubclass(object,Student)
Out[3]: False

In [4]: issubclass(Student,object)
Out[4]: True

Также возвращает True, если класс является подклассом элемента в кортеже classinfo.

In [1]: issubclass(int,(int,float))
Out[1]: True

37 Создайте тип итератора

использоватьiter(obj, sentinel), возвращает итерируемый объект, sentinel можно опустить (после итерации к этому элементу немедленно завершается)

In [1]: lst = [1,3,5]

In [2]: for i in iter(lst):
    ...:     print(i)
    ...:
1
3
5
In [1]: class TestIter(object):
    ...:     def __init__(self):
    ...:         self.l=[1,3,2,3,4,5]
    ...:         self.i=iter(self.l)
    ...:     def __call__(self):  #定义了__call__方法的类的实例是可调用的
    ...:         item = next(self.i)
    ...:         print ("__call__ is called,fowhich would return",item)
    ...:         return item
    ...:     def __iter__(self): #支持迭代协议(即定义有__iter__()函数)
    ...:         print ("__iter__ is called!!")
    ...:         return iter(self.l)
In [2]: t = TestIter()
In [3]: t() # 因为实现了__call__,所以t实例能被调用
__call__ is called,which would return 1
Out[3]: 1

In [4]: for e in TestIter(): # 因为实现了__iter__方法,所以t能被迭代
    ...:     print(e)
    ...: 
__iter__ is called!!
1
3
2
3
4
5

44 Корень всех объектов

объект является базовым классом для всех классов

In [1]: o = object()

In [2]: type(o)
Out[2]: object

45 Открыть файл

вернуть файловый объект

In [1]: fo = open('D:/a.txt',mode='r', encoding='utf-8')

In [2]: fo.read()
Out[2]: '\ufefflife is not so long,\nI use Python to play.'

таблица значений режима:

персонаж значение
'r' читать (по умолчанию)
'w' сначала напишите и обрежьте файл
'x' Эксклюзивное создание, ошибка, если файл уже существует
'a' написать, добавить в конце, если файл существует
'b' двоичный режим
't' текстовый режим (по умолчанию)
'+' Открыт для обновлений (чтение и запись)

46-я сила

база в степени exp, если мод дан, бери остаток

In [1]: pow(3, 2, 4)
Out[1]: 1

47 Печать

In [5]: lst = [1,3,5]

In [6]: print(lst)
[1, 3, 5]

In [7]: print(f'lst: {lst}')
lst: [1, 3, 5]

In [8]: print('lst:{}'.format(lst))
lst:[1, 3, 5]

In [9]: print('lst:',lst)
lst: [1, 3, 5]

48 Два способа создания свойств

Возвращает атрибут свойства, типичное использование:

class C:
    def __init__(self):
        self._x = None

    def getx(self):
        return self._x

    def setx(self, value):
        self._x = value

    def delx(self):
        del self._x
    # 使用property类创建 property 属性
    x = property(getx, setx, delx, "I'm the 'x' property.")

Используйте декоратор python, чтобы добиться того же кода эффекта, что и выше:

class C:
    def __init__(self):
        self._x = None

    @property
    def x(self):
        return self._x

    @x.setter
    def x(self, value):
        self._x = value

    @x.deleter
    def x(self):
        del self._x

49 Создать последовательность диапазонов

  1. range(stop)
  2. range(start, stop[,step])

Создайте неизменяемую последовательность:

In [1]: range(11)
Out[1]: range(0, 11)

In [2]: range(0,11,1)
Out[2]: range(0, 11)

50 Обратный итератор

In [1]: rev = reversed([1,4,2,3,1])

In [2]: for i in rev:
     ...:     print(i)
     ...:
1
3
2
4
1

51 округлено

округление,ndigitsПредставляет несколько цифр после запятой:

In [11]: round(10.0222222, 3)
Out[11]: 10.022

In [12]: round(10.05,1)
Out[12]: 10.1

52 Преобразование в тип коллекции

Возвращает объект набора, в наборе не допускаются повторяющиеся элементы:

In [159]: a = [1,4,2,3,1]

In [160]: set(a)
Out[160]: {1, 2, 3, 4}

53 Преобразование в объект среза

class slice(start, stop[, step])

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

In [1]: a = [1,4,2,3,1]

In [2]: my_slice_meaning = slice(0,5,2)

In [3]: a[my_slice_meaning]
Out[3]: [1, 2, 1]

54 функции сортировки из коробки

Сортировать:

In [1]: a = [1,4,2,3,1]

In [2]: sorted(a,reverse=True)
Out[2]: [4, 3, 2, 1, 1]

In [3]: a = [{'name':'xiaoming','age':18,'gender':'male'},{'name':'
     ...: xiaohong','age':20,'gender':'female'}]
In [4]: sorted(a,key=lambda x: x['age'],reverse=False)
Out[4]:
[{'name': 'xiaoming', 'age': 18, 'gender': 'male'},
 {'name': 'xiaohong', 'age': 20, 'gender': 'female'}]

55 Функция суммирования

Итог:

In [181]: a = [1,4,2,3,1]

In [182]: sum(a)
Out[182]: 11

In [185]: sum(a,10) #求和的初始值为10
Out[185]: 21

56 поворотов кортежа

tuple()Преобразование объекта в неизменяемый тип последовательности

In [16]: i_am_list = [1,3,5]
In [17]: i_am_tuple = tuple(i_am_list)
In [18]: i_am_tuple
Out[18]: (1, 3, 5)

57 Просмотр типов объектов

class type(name, bases, dict)

При передаче параметра вернутьobjectтип:

In [1]: class Student():
   ...:     def __init__(self,id,name):
   ...:         self.id = id
   ...:         self.name = name
   ...:     def __repr__(self):
   ...:         return 'id = '+self.id +', name = '+self.name
   ...: 
   ...: 

In [2]: xiaoming = Student(id='001',name='xiaoming')
In [3]: type(xiaoming)
Out[3]: __main__.Student

In [4]: type(tuple())
Out[4]: tuple

58 агрегатных итераторов

Создайте итератор, который агрегирует элементы из каждого итерируемого объекта:

In [1]: x = [3,2,1]
In [2]: y = [4,5,6]
In [3]: list(zip(y,x))
Out[3]: [(4, 3), (5, 2), (6, 1)]

In [4]: a = range(5)
In [5]: b = list('abcde')
In [6]: b
Out[6]: ['a', 'b', 'c', 'd', 'e']
In [7]: [str(y) + str(x) for x,y in zip(a,b)]
Out[7]: ['a0', 'b1', 'c2', 'd3', 'e4']

59 nonlocal используется во встроенных функциях

Ключевые словаnonlocalОбычно используется при вложении функций, объявлении переменныхiявляется нелокальной переменной; Если не объявлено,i+=1показыватьiдля функцииwrapperлокальные переменные внутриi+=1При ссылке (reference) i не объявляется, поэтому будет сообщеноunreferenced variableошибка.

def excepter(f):
    i = 0
    t1 = time.time()
    def wrapper(): 
        try:
            f()
        except Exception as e:
            nonlocal i
            i += 1
            print(f'{e.args[0]}: {i}')
            t2 = time.time()
            if i == n:
                print(f'spending time:{round(t2-t1,2)}')
    return wrapper

60 global объявляет глобальную переменную

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

i = 5
def f():
    print(i)

def g():
    print(i)
    pass

f()
g()

Обе функции f и g могут совместно использовать переменныеi, программа не сообщает об ошибке, поэтому они все еще не понимают, почему они ее используютglobal.

Однако, если я хочу иметь пару функцийiПостепенно, таким образом:

def h():
    i += 1

h()

В этот момент выполнение программы, бах, пошло не так! Выбросить исключение:UnboundLocalError, получается, что компилятор интерпретируетi+=1будетiрешимость функционироватьh()локальные переменные внутри функции, очевидно внутри этой функции, компилятор не может найтиiопределение, поэтому будет сообщено об ошибке.

globalПредлагается решить эту проблему, в функции h явно указать компиляторуiявляется глобальной переменной, то компилятор будет искать ее вне функцииiопределение, реализованоi+=1Задний,iЭто также глобальная переменная, и ее значение увеличивается на 1:

i = 0
def h():
    global i
    i += 1

h()
print(i)

61 Цепочное сравнение

i = 3
print(1 < i < 3)  # False
print(1 < i <= 3)  # True

62 Реализация калькулятора без else и если

from operator import *


def calculator(a, b, k):
    return {
        '+': add,
        '-': sub,
        '*': mul,
        '/': truediv,
        '**': pow
    }[k](a, b)


calculator(1, 2, '+')  # 3
calculator(3, 4, '**')  # 81

63 Цепная операция

from operator import (add, sub)


def add_or_sub(a, b, oper):
    return (add if oper == '+' else sub)(a, b)


add_or_sub(1, 2, '-')  # -1

64 Поменять местами два элемента

def swap(a, b):
    return b, a


print(swap(1, 0))  # (0,1)

65 перейти к самому среднему

def score_mean(lst):
    lst.sort()
    lst2=lst[1:(len(lst)-1)]
    return round((sum(lst2)/len(lst2)),1)

lst=[9.1, 9.0,8.1, 9.7, 19,8.2, 8.6,9.8]
score_mean(lst) # 9.1

66 Распечатайте таблицу умножения на 99.

Распечатайте таблицу умножения в следующем формате

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

Всего 10 строк, перваяiпервый в очередиjСтолбцы равны:j*i,

в,

iДиапазоны:1<=i<=9

jДиапазоны:1<=j<=i

в соответствии с例子分析Описание языка преобразуется в следующий код:

for i in range(1,10):
    ...:     for j in range(1,i+1):
    ...:         print('%d*%d=%d'%(j,i,j*i),end="\t")
    ...:     print()

67 полностью развернуто

Для следующих массивов:

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

Как полностью расшириться в одномерное. Этот небольшой пример достигаетflattenЭто рекурсивная версия, два параметра представляют собой массив с расширением и выходной массив.

from collections.abc import *

def flatten(lst, out_lst=None):
    if out_lst is None:
        out_lst = []
    for i in lst:
        if isinstance(i, Iterable): # 判断i是否可迭代
            flatten(i, out_lst)  # 尾数递归
        else:
            out_lst.append(i)    # 产生结果
    return out_lst

перечислитьflatten:

print(flatten([[1,2,3],[4,5]]))
print(flatten([[1,2,3],[4,5]], [6,7]))
print(flatten([[[1,2,3],[4,5,6]]]))
# 结果:
[1, 2, 3, 4, 5]
[6, 7, 1, 2, 3, 4, 5]
[1, 2, 3, 4, 5, 6]

в пустом видеflattenЕсть несколько тонких отличий от реализации функции выше:

import numpy
b = numpy.array([[1,2,3],[4,5]])
b.flatten()
array([list([1, 2, 3]), list([4, 5])], dtype=object)

68 Список равных частей

from math import ceil

def divide(lst, size):
    if size <= 0:
        return [lst]
    return [lst[i * size:(i+1)*size] for i in range(0, ceil(len(lst) / size))]


r = divide([1, 3, 5, 7, 9], 2)
print(r)  # [[1, 3], [5, 7], [9]]

r = divide([1, 3, 5, 7, 9], 0)
print(r)  # [[1, 3, 5, 7, 9]]

r = divide([1, 3, 5, 7, 9], -3)
print(r)  # [[1, 3, 5, 7, 9]]

69 Сжатие списка

def filter_false(lst):
    return list(filter(bool, lst))


r = filter_false([None, 0, False, '', [], 'ok', [1, 2]])
print(r)  # ['ok', [1, 2]]

70 Более длинный список

def max_length(*lst):
    return max(*lst, key=lambda v: len(v))


r = max_length([1, 2, 3], [4, 5, 6, 7], [8])
print(f'更长的列表是{r}')  # [4, 5, 6, 7]

r = max_length([1, 2, 3], [4, 5, 6, 7], [8, 9])
print(f'更长的列表是{r}')  # [4, 5, 6, 7]

71 Умеренный

def top1(lst):
    return max(lst, default='列表为空', key=lambda v: lst.count(v))

lst = [1, 3, 3, 2, 1, 1, 2]
r = top1(lst)
print(f'{lst}中出现次数最多的元素为:{r}')  # [1, 3, 3, 2, 1, 1, 2]中出现次数最多的元素为:1

72 Наибольшее количество столов

def max_lists(*lst):
    return max(max(*lst, key=lambda v: max(v)))


r = max_lists([1, 2, 3], [6, 7, 8], [4, 5])
print(r)  # 8

73 Проверка списка дубликатов

def has_duplicates(lst):
    return len(lst) == len(set(lst))


x = [1, 1, 2, 2, 3, 2, 3, 4, 5, 6]
y = [1, 2, 3, 4, 5]
has_duplicates(x)  # False
has_duplicates(y)  # True

74 Инверсия списка

def reverse(lst):
    return lst[::-1]


r = reverse([1, -2, 3, 4, 1, 2])
print(r)  # [2, 1, 4, 3, -2, 1]

75 Арифметическая последовательность с плавающей запятой

def rang(start, stop, n):
    start,stop,n = float('%.2f' % start), float('%.2f' % stop),int('%.d' % n)
    step = (stop-start)/n
    lst = [start]
    while n > 0:
        start,n = start+step,n-1
        lst.append(round((start), 2))
    return lst

rang(1, 8, 10) # [1.0, 1.7, 2.4, 3.1, 3.8, 4.5, 5.2, 5.9, 6.6, 7.3, 8.0]

76 Группировка по состоянию

def bif_by(lst, f):
    return [ [x for x in lst if f(x)],[x for x in lst if not f(x)]]

records = [25,89,31,34] 
bif_by(records, lambda x: x<80) # [[25, 31, 34], [89]]

77 map реализует векторные операции

#多序列运算函数—map(function,iterabel,iterable2)
lst1=[1,2,3,4,5,6]
lst2=[3,4,5,6,3,2]
list(map(lambda x,y:x*y+1,lst1,lst2))
### [4, 9, 16, 25, 16, 13]

78 самый большой словарь

def max_pairs(dic):
    if len(dic) == 0:
        return dic
    max_val = max(map(lambda v: v[1], dic.items()))
    return [item for item in dic.items() if item[1] == max_val]


r = max_pairs({'a': -10, 'b': 5, 'c': 3, 'd': 5})
print(r)  # [('b', 5), ('d', 5)]

79 Объединить два словаря

def merge_dict2(dic1, dic2):
    return {**dic1, **dic2}  # python3.5后支持的一行代码实现合并字典

merge_dict({'a': 1, 'b': 2}, {'c': 3})  # {'a': 1, 'b': 2, 'c': 3}

80 топн словарь

from heapq import nlargest

# 返回字典d前n个最大值对应的键

def topn_dict(d, n):
    return nlargest(n, d, key=lambda k: d[k])

topn_dict({'a': 10, 'b': 8, 'c': 9, 'd': 10}, 3)  # ['a', 'd', 'c']

81 гипотеза

from collections import Counter

# 检查两个字符串是否 相同字母异序词,简称:互为变位词

def anagram(str1, str2):
    return Counter(str1) == Counter(str2)

anagram('eleven+two', 'twelve+one')  # True 这是一对神器的变位词
anagram('eleven', 'twelve')  # False

82 Логически объединить словари

(1) Два метода словаря слияния Это общая нотация слияния словарей.

dic1 = {'x': 1, 'y': 2 }
dic2 = {'y': 3, 'z': 4 }
merged1 = {**dic1, **dic2} # {'x': 1, 'y': 3, 'z': 4}

Измените merged['x']=10, значение x в dic1不变,mergedявляется регенерированным新字典.

но,ChainMapВместо этого он внутренне создает список этих словарей. Поэтому используйте ChainMap для слияния словаря, после изменения merged['x']=10 значение x в dic1改变,Следующее:

from collections import ChainMap
merged2 = ChainMap(dic1,dic2)
print(merged2) # ChainMap({'x': 1, 'y': 2}, {'y': 3, 'z': 4})

83 Именованные кортежи улучшают читабельность

from collections import namedtuple
Point = namedtuple('Point', ['x', 'y', 'z'])  # 定义名字为Point的元祖,字段属性有x,y,z
lst = [Point(1.5, 2, 3.0), Point(-0.3, -1.0, 2.1), Point(1.3, 2.8, -2.5)]
print(lst[0].y - lst[1].y)

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

84 Отбор проб

использоватьsampleВыборка, следующий пример случайным образом выбирает 10 из 100 выборок.

from random import randint,sample
lst = [randint(0,50) for _ in range(100)]
print(lst[:5])# [38, 19, 11, 3, 6]
lst_sample = sample(lst,10)
print(lst_sample) # [33, 40, 35, 49, 24, 15, 48, 29, 37, 24]

85 Перемыть набор данных

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

from random import shuffle
lst = [randint(0,50) for _ in range(100)]
shuffle(lst)
print(lst[:5]) # [50, 3, 48, 1, 26]

86 10 равномерно распределенных координатных точек

в случайном модулеuniform(a,b)Сгенерируйте случайное число в [a, b) и сгенерируйте 10 равномерно распределенных двумерных координатных точек следующим образом.

from random import uniform
In [1]: [(uniform(0,10),uniform(0,10)) for _ in range(10)]
Out[1]: 
[(9.244361194237328, 7.684326645514235),
 (8.129267671737324, 9.988395854203773),
 (9.505278771040661, 2.8650440524834107),
 (3.84320100484284, 1.7687190176304601),
 (6.095385729409376, 2.377133802224657),
 (8.522913365698605, 3.2395995841267844),
 (8.827829601859406, 3.9298809217233766),
 (1.4749644859469302, 8.038753079253127),
 (9.005430657826324, 7.58011186920019),
 (8.700789540392917, 1.2217577293254112)]

87 10 координатных точек с распределением Гаусса

в случайном модулеgauss(u,sigma)Создайте значение, которое удовлетворяет распределению Гаусса со средним значением u и стандартным отклонением сигма, и создайте 10 двумерных координатных точек следующим образом: Ошибка выборки (y-2*x-1) удовлетворяет распределению Гаусса со средним значением 0 и стандартное отклонение 1:

from random import gauss
x = range(10)
y = [2*xi+1+gauss(0,1) for xi in x]
points = list(zip(x,y))
### 10个二维点:
[(0, -0.86789025305992),
 (1, 4.738439437453464),
 (2, 5.190278040856102),
 (3, 8.05270893133576),
 (4, 9.979481700775292),
 (5, 11.960781766216384),
 (6, 13.025427054303737),
 (7, 14.02384035204836),
 (8, 15.33755823101161),
 (9, 17.565074449028497)]

88 chain Эффективное объединение нескольких объектов-контейнеров

chainФункция объединяет a и b, принимая во внимание эффективность использования памяти и записывая более элегантно.

from itertools import chain
a = [1,3,5,0]
b = (2,4,6)

for i in chain(a,b):
  print(i)
### 结果
1
3
5
0
2
4
6

89 Управление функциональными объектами

In [31]: def f():
    ...:     print('i\'m f')
    ...:

In [32]: def g():
    ...:     print('i\'m g')
    ...:

In [33]: [f,g][1]()
i'm g

Создайте список объектов-функций и вызовите их единообразно в соответствии с индексом, который вы хотите вызвать.

90 Генерация обратной последовательности

list(range(10,-1,-1)) # [10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0]

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

Две ямы для питона

1 Кортеж с одним элементом

Тип параметра некоторых функций в Python — это кортеж с 1 элементом, который неправильно создавать:

c = (5) # NO!

На самом деле он создает целочисленный элемент 5, за которым должен следовать逗号:

c = (5,) # YES!

2 Параметр по умолчанию установлен на пустой

Функция с параметрами по умолчанию, если тип является контейнером и задана пустой:

def f(a,b=[]):  # NO!
    print(b)
    return b

ret = f(1)
ret.append(1)
ret.append(2)
# 当再调用f(1)时,预计打印为 []
f(1)
# 但是却为 [1,2]

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

def f(a,b=None): # YES!
    pass

3 Яма несвязанных общих переменных

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

i = 1
def f():
    i+=1 #NO!
    
def g():
    print(i)

Объявление должно отображаться внутри функции fiДля глобальных переменных:

i = 1
def f():
    global i # YES!
    i+=1

4 Яма лямбда-свободных параметров

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

a = [lambda x: x+i for i in range(3)] # NO!
for f in a:
    print(f(1))
# 你可能期望输出:1,2,3

Но фактический результат: 3, 3, 3. Определите используемую лямбдуiОн называется свободным параметром, и его значение действительно определяется только при вызове лямбда-функции, что похоже на печать 2 ниже, вы должны быть уверены.

a = 0
a = 1
a = 2
def f(a):
    print(a)

Правильный способ - преобразовать自由参数для лямбда-функции默认参数:

a = [lambda x,i=i: x+i for i in range(3)] # YES!

5 Не могу сказать, является ли это параметром по умолчанию или параметром ключевого слова

Определите функцию f. При ее использовании допустимы следующие три способа записи ширины.Если вы не понимаете прототип функции, легко определить, является ли ширина позиционным параметром или параметром ключевого слова.

def f(a,width=10.0):
    print(width)

f(1,width=15.0) # 15.0  # 容易分不清width是位置参数还是关键字参数
f(1,15.0) # 15.0
f(1) # 10.0

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

def f(a,**b):
    print(b)
f(1,width=15.0) # width是关键字参数,不是默认参数

6 Яма для удаления списка

Удалить элемент из списка, который может повторяться в списке несколько раз:

def del_item(lst,e):
    return [lst.remove(i) for i in e if i==e] # NO!

Рассмотрите возможность удаления элемента 3 в этой последовательности [1,3,3,3,5] только для удаления двух из них:

del_item([1,3,3,3,5],3) # 结果:[1,3,5]

Правильный путь:

def del_item(lst,e):
    d = dict(zip(range(len(lst)),lst)) # YES! 构造字典
    return [v for k,v in d.items() if v!=e]

7 Список ям быстрого копирования

в питоне*При операциях со списками достигается быстрое копирование элементов:

a = [1,3,5] * 3 # [1,3,5,1,3,5,1,3,5]
a[0] = 10 # [10, 2, 3, 1, 2, 3, 1, 2, 3]

Если элементы списка являются составными типами, такими как списки или словари:

a = [[1,3,5],[2,4]] * 3 # [[1, 3, 5], [2, 4], [1, 3, 5], [2, 4], [1, 3, 5], [2, 4]]

a[0][0] = 10 #  

Результаты могут вас удивить, другиеa[1[0]и т. д. также изменен на 10

[[10, 3, 5], [2, 4], [10, 3, 5], [2, 4], [10, 3, 5], [2, 4]]

Это связано с тем, что *copyed составные объекты являются поверхностными ссылками, то есть номера домов id(a[0]) и id(a[2]) равны. Если вы хотите добиться эффекта глубокого копирования, сделайте следующее:

a = [[] for _ in range(3)]

8 строк находится

In [1]: a = 'something'
    ...: b = 'some'+'thing'
    ...: id(a)==id(b)
Out[1]: True

Если приведенный выше пример возвращаетTrue, но почему следующий примерFalse:

In [1]: a = '@zglg.com'

In [2]: b = '@zglg'+'.com'

In [3]: id(a)==id(b)
Out[3]: False

Это связано с оптимизацией компиляции Cpython, поведение называется字符串驻留, но резидентная строка содержит только буквы, цифры или знаки подчеркивания.

9 неизменяемых объектов одного значения

In [5]: d = {}
    ...: d[1] = 'java'
    ...: d[1.0] = 'python'

In [6]: d
Out[6]: {1: 'python'}

### key=1,value=java的键值对神器消失了
In [7]: d[1]
Out[7]: 'python'
In [8]: d[1.0]
Out[8]: 'python'

Это связано с тем, что неизменяемые объекты с одним и тем же значением всегда имеют в Python相同的哈希值

из-за существования哈希冲突, объекты с разными значениями также могут иметь одинаковое значение хеш-функции.

10 Порядок уничтожения объектов

создать классSE:

class SE(object):
  def __init__(self):
    print('init')
  def __del__(self):
    print('del')

Создайте два экземпляра SE, используяisсудить:

In [63]: SE() is SE()
init
init
del
del
Out[63]: False

Создайте два экземпляра SE, используяidсудить:

In [64]: id(SE()) == id(SE())
init
del
init
del
Out[64]: True

перечислитьidфункция, Python создает экземпляр класса SE и используетidПосле того, как функция получает адрес памяти, она уничтожает память и отбрасывает объект.

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

Но он ведет себя по-другому, как вы можете видеть, распечатав заказ.

11 Полностью понимаю для

In [65]: for i in range(5):
    ...:   print(i)
    ...:   i = 10
0
1
2
3
4

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

Способ для работы в Python, i = 10, не влияет на цикл. Следующий элемент, сгенерированный диапазоном (5), распаковывается и присваивается переменной целевого списка.i.

12 Знайте, когда выполнять

array = [1, 3, 5]
g = (x for x in array if array.count(x) > 0)

gДля генератора вернитесь после list(g)[1,3,5], потому что каждый элемент должен появиться хотя бы один раз. Так что этот результат не удивителен. Однако посмотрите на следующий пример:

array = [1, 3, 5]
g = (x for x in array if array.count(x) > 0)
array = [5, 7, 9]

Извините, чему равен list(g)? Разве это не то же самое, что и результат приведенного выше примера, результат также[1,3,5],но:

In [74]: list(g)
Out[74]: [5]

Это немного странно~~ Причина в следующем:

В выражении генератора предложение in выполняется во время объявления, а условное предложение выполняется во время выполнения.

Итак, код:

array = [1, 3, 5]
g = (x for x in array if array.count(x) > 0)
array = [5, 7, 9]

Эквивалентно:

g = (x for x in [1,3,5] if [5,7,9].count(x) > 0)

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

3. Строки Python и регулярные выражения

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

1 перевернуть строку

st="python"
#方法1
''.join(reversed(st))
#方法2
st[::-1]

2 операции нарезки строк

字符串切片操作——查找替换3或5的倍数
In [1]:[str("java"[i%3*4:]+"python"[i%5*6:] or i) for i in range(1,15)]
OUT[1]:['1',
 '2',
 'java',
 '4',
 'python',
 'java',
 '7',
 '8',
 'java',
 'python',
 '11',
 'java',
 '13',
 '14']

3 присоединиться к конкатенации строк

In [4]: mystr = ['1',
   ...:  '2',
   ...:  'java',
   ...:  '4',
   ...:  'python',
   ...:  'java',
   ...:  '7',
   ...:  '8',
   ...:  'java',
   ...:  'python',
   ...:  '11',
   ...:  'java',
   ...:  '13',
   ...:  '14']

In [5]: ','.join(mystr) #用逗号连接字符串
Out[5]: '1,2,java,4,python,java,7,8,java,python,11,java,13,14'

Длина строки 4 байта

def str_byte_len(mystr):
    return (len(mystr.encode('utf-8')))


str_byte_len('i love python')  # 13(个字节)
str_byte_len('字符')  # 6(个字节)

Далее обычная часть

import re

1 Найдите первую совпадающую строку

s = 'i love python very much'
pat = 'python' 
r = re.search(pat,s)
print(r.span()) #(7,13)

2 найти индекс всех единиц

s = '山东省潍坊市青州第1中学高三1班'
pat = '1'
r = re.finditer(pat,s)
for i in r:
    print(i)

# <re.Match object; span=(9, 10), match='1'>
# <re.Match object; span=(14, 15), match='1'>

3 \d соответствует цифрам [0-9]

findall находит все совпадения во всех местах

s = '一共20行代码运行时间13.59s'
pat = r'\d+' # +表示匹配数字(\d表示数字的通用字符)1次或多次
r = re.findall(pat,s)
print(r)
# ['20', '13', '59']

4 соответствует числам с плавающей запятой

? означает, что предыдущий символ соответствует 0 или 1 раз

s = '一共20行代码运行时间13.59s'
pat = r'\d+\.?\d+' # ?表示匹配小数点(\.)0次或1次
r = re.findall(pat,s)
print(r)
# ['20', '13.59']

5^ соответствует началу строки

s = 'This module provides regular expression matching operations similar to those found in Perl'
pat = r'^[emrt]' # 查找以字符e,m,r或t开始的字符串
r = re.findall(pat,s)
print(r)
# [],因为字符串的开头是字符`T`,不在emrt匹配范围内,所以返回为空
IN [11]: s2 = 'email for me is guozhennianhua@163.com'
re.findall('^[emrt].*',s2)# 匹配以e,m,r,t开始的字符串,后面是多个任意字符
Out[11]: ['email for me is guozhennianhua@163.com']

6 re.я игнорирую регистр

s = 'That'
pat = r't' 
r = re.findall(pat,s,re.I)
In [22]: r
Out[22]: ['T', 't']

7 Понимание роли компиляции

Если вы хотите сделать много совпадений, вы можете сначала скомпилировать строку совпадения:

import re
pat = re.compile('\W+') # \W 匹配不是数字和字母的字符
has_special_chars = pat.search('ed#2@edc') 
if has_special_chars:
    print(f'str contains special characters:{has_special_chars.group(0)}')

###输出结果: 
 # str contains special characters:#   

### 再次使用pat正则编译对象 做匹配
again_pattern = pat.findall('guozhennianhua@163.com')
if '@' in again_pattern:
    print('possibly it is an email')

8 Используйте () для ввода слов без пробелов

использовать()захватывать

s = 'This module provides regular expression matching operations similar to those found in Perl'
pat = r'\s([a-zA-Z]+)'  
r = re.findall(pat,s)
print(r) #['module', 'provides', 'regular', 'expression', 'matching', 'operations', 'similar', 'to', 'those', 'found', 'in', 'Perl']

Убедитесь, что первое слово не включено в извлеченные слова, используйте?Указывает, что предыдущий символ появляется 0 или 1 раз, но этот символ также означает жадное или нежадное сопоставление, поэтому будьте осторожны при его использовании.

s = 'This module provides regular expression matching operations similar to those found in Perl'
pat = r'\s?([a-zA-Z]+)'  
r = re.findall(pat,s)
print(r) #['This', 'module', 'provides', 'regular', 'expression', 'matching', 'operations', 'similar', 'to', 'those', 'found', 'in', 'Perl']

9 разделенных разделенных слов

Разбиение слов с помощью описанного выше метода не является кратким, оно предназначено только для демонстрации. Самый простой способ разделить слова — использоватьsplitфункция.

s = 'This module provides regular expression matching operations similar to those found in Perl'
pat = r'\s+'  
r = re.split(pat,s)
print(r) # ['This', 'module', 'provides', 'regular', 'expression', 'matching', 'operations', 'similar', 'to', 'those', 'found', 'in', 'Perl']

### 上面这句话也可直接使用str自带的split函数:
s.split(' ') #使用空格分隔

### 但是,对于风格符更加复杂的情况,split无能为力,只能使用正则

s = 'This,,,   module ; \t   provides|| regular ; '
words = re.split('[,\s;|]+',s)  #这样分隔出来,最后会有一个空字符串
words = [i for i in words if len(i)>0]

10 совпадений совпадений с начала строки

Уведомлениеmatch,searchд., разные:

  1. функция совпадения
import re
### match
mystr = 'This'
pat = re.compile('hi')
pat.match(mystr) # None
pat.match(mystr,1) # 从位置1处开始匹配
Out[90]: <re.Match object; span=(1, 3), match='hi'>
  1. функция поиска поиск заключается в том, чтобы начать поиск с любой позиции в строке
In [91]: mystr = 'This'
    ...: pat = re.compile('hi')
    ...: pat.search(mystr)
Out[91]: <re.Match object; span=(1, 3), match='hi'>

11 Заменить совпадающие подстроки

subФункция реализует замену совпадающей подстроки

content="hello 12345, hello 456321"    
pat=re.compile(r'\d+') #要替换的部分
m=pat.sub("666",content)
print(m) # hello 666, hello 666

12 Жадный захват

(.*) означает захватить любое количество символов, как можно больше совпадающих символов

content='<h>ddedadsad</h><div>graph</div>bb<div>math</div>cc'
pat=re.compile(r"<div>(.*)</div>")  #贪婪模式
m=pat.findall(content)
print(m) #匹配结果为: ['graph</div>bb<div>math']

13 Нежадный захват

Просто поставьте знак вопроса (?), результат совершенно другой. Это нежадное сопоставление. В этом примере вы можете почувствовать разницу между жадным и нежадным сопоставлением.

content='<h>ddedadsad</h><div>graph</div>bb<div>math</div>cc'
pat=re.compile(r"<div>(.*?)</div>")
m=pat.findall(content)
print(m) # ['graph', 'math']

Нежадный захват, бери, как только увидишь.

14 Краткое изложение общих метасимволов

. 匹配任意字符  
^ 匹配字符串开始位置 
$ 匹配字符串中结束的位置 
* 前面的原子重复0次、1次、多次 
? 前面的原子重复0次或者1次 
+ 前面的原子重复1次或多次
{n} 前面的原子出现了 n 次
{n,} 前面的原子至少出现 n 次
{n,m} 前面的原子出现次数介于 n-m 之间
( ) 分组,需要输出的部分

15 Краткое изложение общих общих символов

\s  匹配空白字符 
\w  匹配任意字母/数字/下划线 
\W  和小写 w 相反,匹配任意字母/数字/下划线以外的字符
\d  匹配十进制数字
\D  匹配除了十进制数以外的值 
[0-9]  匹配一个0-9之间的数字
[a-z]  匹配小写英文字母
[A-Z]  匹配大写英文字母

14 Проверка безопасности пароля

Требования к безопасности пароля: 1) Пароль должен содержать от 6 до 20 цифр; 2) Пароль должен содержать только английские буквы и цифры.

pat = re.compile(r'\w{6,20}') # 这是错误的,因为\w通配符匹配的是字母,数字和下划线,题目要求不能含有下划线
# 使用最稳的方法:\da-zA-Z满足`密码只包含英文字母和数字`
pat = re.compile(r'[\da-zA-Z]{6,20}')

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

pat.fullmatch('qaz12') # 返回 None, 长度小于6
pat.fullmatch('qaz12wsxedcrfvtgb67890942234343434') # None 长度大于22
pat.fullmatch('qaz_231') # None 含有下划线
pat.fullmatch('n0passw0Rd')
Out[4]: <re.Match object; span=(0, 10), match='n0passw0Rd'>

15 Сканирование заголовка главной страницы Baidu

import re
from urllib import request

#爬虫爬取百度首页内容
data=request.urlopen("http://www.baidu.com/").read().decode()

#分析网页,确定正则表达式
pat=r'<title>(.*?)</title>'

result=re.search(pat,data)
print(result) <re.Match object; span=(1358, 1382), match='<title>百度一下,你就知道</title>'>

result.group() # 百度一下,你就知道

16 Пакетное преобразование в формат верблюда (верблюд)

Пакетное преобразование имен полей базы данных в формат верблюжьего регистра

Процесс анализа

# 用到的正则串讲解
# \s 指匹配: [ \t\n\r\f\v]
# A|B:表示匹配A串或B串
# re.sub(pattern, newchar, string): 
# substitue代替,用newchar字符替代与pattern匹配的字符所有.
# title(): 转化为大写,例子:
# 'Hello world'.title() # 'Hello World'
# print(re.sub(r"\s|_|", "", "He llo_worl\td"))
s = re.sub(r"(\s|_|-)+", " ",
           'some_database_field_name').title().replace(" ", "")  
#结果: SomeDatabaseFieldName
# 可以看到此时的第一个字符为大写,需要转化为小写
s = s[0].lower()+s[1:]  # 最终结果

Организуйте приведенный выше анализ, чтобы получить следующий код:

import re
def camel(s):
    s = re.sub(r"(\s|_|-)+", " ", s).title().replace(" ", "")
    return s[0].lower() + s[1:]

# 批量转化
def batch_camel(slist):
    return [camel(s) for s in slist]

Результаты теста:

s = batch_camel(['student_id', 'student\tname', 'student-add'])
print(s)
# 结果
['studentId', 'studentName', 'studentAdd']

4. Файл Python

1 Получить имя суффикса

import os
file_ext = os.path.splitext('./data/py/test.py')
front,ext = file_ext
In [5]: front
Out[5]: './data/py/test'

In [6]: ext
Out[6]: '.py'

2 операции чтения файлов

import os
# 创建文件夹

def mkdir(path):
    isexists = os.path.exists(path)
    if not isexists:
        os.mkdir(path)
# 读取文件信息

def openfile(filename):
    f = open(filename)
    fllist = f.read()
    f.close()
    return fllist  # 返回读取内容

3 операция записи в файл

# 写入文件信息
# example1
# w写入,如果文件存在,则清空内容后写入,不存在则创建
f = open(r"./data/test.txt", "w", encoding="utf-8")
print(f.write("测试文件写入"))
f.close

# example2
# a写入,文件存在,则在文件内容后追加写入,不存在则创建
f = open(r"./data/test.txt", "a", encoding="utf-8")
print(f.write("测试文件写入"))
f.close

# example3
# with关键字系统会自动关闭文件和处理异常
with open(r"./data/test.txt", "w") as f:
    f.write("hello world!")

4 имя файла в пути

In [11]: import os
    ...: file_ext = os.path.split('./data/py/test.py')
    ...: ipath,ifile = file_ext
    ...:

In [12]: ipath
Out[12]: './data/py'

In [13]: ifile
Out[13]: 'test.py'

5 Пакетное изменение суффикса файла

Пакетное изменение суффикса файла

В этом примере используется Pythonosмодули иargparseмодули, будет рабочим каталогомwork_dirВсе суффиксы подold_extФайл изменен на суффикс с именемnew_ext

Благодаря этому примеру вы получите общее представление оargparseОсновное использование модуля.

модуль импорта

import argparse
import os

Определить параметры скрипта

def get_parser():
    parser = argparse.ArgumentParser(
        description='工作目录中文件后缀名修改')
    parser.add_argument('work_dir', metavar='WORK_DIR', type=str, nargs=1,
                        help='修改后缀名的文件目录')
    parser.add_argument('old_ext', metavar='OLD_EXT',
                        type=str, nargs=1, help='原来的后缀')
    parser.add_argument('new_ext', metavar='NEW_EXT',
                        type=str, nargs=1, help='新的后缀')
    return parser

Пакетная модификация имен суффиксов

def batch_rename(work_dir, old_ext, new_ext):
    """
    传递当前目录,原来后缀名,新的后缀名后,批量重命名后缀
    """
    for filename in os.listdir(work_dir):
        # 获取得到文件后缀
        split_file = os.path.splitext(filename)
        file_ext = split_file[1]
        # 定位后缀名为old_ext 的文件
        if old_ext == file_ext:
            # 修改后文件的完整名称
            newfile = split_file[0] + new_ext
            # 实现重命名操作
            os.rename(
                os.path.join(work_dir, filename),
                os.path.join(work_dir, newfile)
            )
    print("完成重命名")
    print(os.listdir(work_dir))

Реализовать основной

def main():
    """
    main函数
    """
    # 命令行参数
    parser = get_parser()
    args = vars(parser.parse_args())
    # 从命令行参数中依次解析出参数
    work_dir = args['work_dir'][0]
    old_ext = args['old_ext'][0]
    if old_ext[0] != '.':
        old_ext = '.' + old_ext
    new_ext = args['new_ext'][0]
    if new_ext[0] != '.':
        new_ext = '.' + new_ext

    batch_rename(work_dir, old_ext, new_ext)

Пакетное преобразование 6 xls в xlsx

import os


def xls_to_xlsx(work_dir):
    """
    传递当前目录,原来后缀名,新的后缀名后,批量重命名后缀
    """
    old_ext, new_ext = '.xls', '.xlsx'
    for filename in os.listdir(work_dir):
        # 获取得到文件后缀
        split_file = os.path.splitext(filename)
        file_ext = split_file[1]
        # 定位后缀名为old_ext 的文件
        if old_ext == file_ext:
            # 修改后文件的完整名称
            newfile = split_file[0] + new_ext
            # 实现重命名操作
            os.rename(
                os.path.join(work_dir, filename),
                os.path.join(work_dir, newfile)
            )
    print("完成重命名")
    print(os.listdir(work_dir))


xls_to_xlsx('./data')

# 输出结果:
# ['cut_words.csv', 'email_list.xlsx', 'email_test.docx', 'email_test.jpg', 'email_test.xlsx', 'geo_data.png', 'geo_data.xlsx',
'iotest.txt', 'pyside2.md', 'PySimpleGUI-4.7.1-py3-none-any.whl', 'test.txt', 'test_excel.xlsx', 'ziptest', 'ziptest.zip']

7 различных строк пользовательского файла

Сравните строки в двух файлах, содержимое которых отличается, и верните количество этих строк, начиная с 1.

Определите функцию для подсчета количества строк в файле

# 统计文件个数
    def statLineCnt(statfile):
        print('文件名:'+statfile)
        cnt = 0
        with open(statfile, encoding='utf-8') as f:
            while f.readline():
                cnt += 1
            return cnt

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

# more表示含有更多行数的文件
        def diff(more, cnt, less):
            difflist = []
            with open(less, encoding='utf-8') as l:
                with open(more, encoding='utf-8') as m:
                    lines = l.readlines()
                    for i, line in enumerate(lines):
                        if line.strip() != m.readline().strip():
                            difflist.append(i)
            if cnt - i > 1:
                difflist.extend(range(i + 1, cnt))
            return [no+1 for no in difflist]

Основная функция:

# 返回的结果行号从1开始
# list表示fileA和fileB不同的行的编号

def file_diff_line_nos(fileA, fileB):
    try:
        cntA = statLineCnt(fileA)
        cntB = statLineCnt(fileB)
        if cntA > cntB:
            return diff(fileA, cntA, fileB)
        return diff(fileB, cntB, fileA)

    except Exception as e:
        print(e)

Сравните два файла A и B, возьмите относительно короткий файл для сравнения, отфильтруйте новую строку после строки\nи пространства.

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

использоватьfile_diff_line_nosфункция:

if __name__ == '__main__':
    import os
    print(os.getcwd())

    '''
    例子:
    fileA = "'hello world!!!!''\
            'nice to meet you'\
            'yes'\
            'no1'\
            'jack'"
    fileB = "'hello world!!!!''\
            'nice to meet you'\
            'yes' "
    '''
    diff = file_diff_line_nos('./testdir/a.txt', './testdir/b.txt')
    print(diff)  # [4, 5]

По поводу сравнения файлов, на самом деле в Python есть соответствующий модульdifflib, предоставляет более подробные сравнения файлов в других форматах, вы можете обратиться к:

docs.Python.org/3/library/…

8 Получить файл с указанным суффиксом

import os

def find_file(work_dir,extension='jpg'):
    lst = []
    for filename in os.listdir(work_dir):
        print(filename)
        splits = os.path.splitext(filename)
        ext = splits[1] # 拿到扩展名
        if ext == '.'+extension:
            lst.append(filename)
    return lst

r = find_file('.','md') 
print(r) # 返回所有目录下的md文件

9 Получить время модификации файла в пакетном режиме

# 获取目录下文件的修改时间
import os
from datetime import datetime

print(f"当前时间:{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")

def get_modify_time(indir):
    for root, _, files in os.walk(indir):  # 循环D:\works目录和子目录
        for file in files:
            absfile = os.path.join(root, file)
            modtime = datetime.fromtimestamp(os.path.getmtime(absfile))
            now = datetime.now()
            difftime = now-modtime
            if difftime.days < 20:  # 条件筛选超过指定时间的文件
                print(f"""{absfile}
                    修改时间[{modtime.strftime('%Y-%m-%d %H:%M:%S')}]
                    距今[{difftime.days:3d}天{difftime.seconds//3600:2d}时{difftime.seconds%3600//60:2d}]"""
                      )  # 打印相关信息


get_modify_time('./data')
打印效果:
当前时间:2019-12-22 16:38:53
./data\cut_words.csv
                    修改时间[2019-12-21 10:34:15]
                    距今[  1天 6时 4]
当前时间:2019-12-22 16:38:53
./data\cut_words.csv
                    修改时间[2019-12-21 10:34:15]
                    距今[  1天 6时 4]
./data\email_test.docx
                    修改时间[2019-12-03 07:46:29]
                    距今[ 19天 8时52]
./data\email_test.jpg
                    修改时间[2019-12-03 07:46:29]
                    距今[ 19天 8时52]
./data\email_test.xlsx
                    修改时间[2019-12-03 07:46:29]
                    距今[ 19天 8时52]
./data\iotest.txt
                    修改时间[2019-12-13 08:23:18]
                    距今[  9天 8时15]
./data\pyside2.md
                    修改时间[2019-12-05 08:17:22]
                    距今[ 17天 8时21]
./data\PySimpleGUI-4.7.1-py3-none-any.whl
                    修改时间[2019-12-05 00:25:47]
                    距今[ 17天16时13]

10 Пакетное сжатие файлов

import zipfile  # 导入zipfile,这个是用来做压缩和解压的Python模块;
import os
import time


def batch_zip(start_dir):
    start_dir = start_dir  # 要压缩的文件夹路径
    file_news = start_dir + '.zip'  # 压缩后文件夹的名字

    z = zipfile.ZipFile(file_news, 'w', zipfile.ZIP_DEFLATED)
    for dir_path, dir_names, file_names in os.walk(start_dir):
        # 这一句很重要,不replace的话,就从根目录开始复制
        f_path = dir_path.replace(start_dir, '')
        f_path = f_path and f_path + os.sep  # 实现当前文件夹以及包含的所有文件的压缩
        for filename in file_names:
            z.write(os.path.join(dir_path, filename), f_path + filename)
    z.close()
    return file_news


batch_zip('./data/ziptest')


11 32-битное шифрование

import hashlib
# 对字符串s实现32位加密


def hash_cry32(s):
    m = hashlib.md5()
    m.update((str(s).encode('utf-8')))
    return m.hexdigest()


print(hash_cry32(1))  # c4ca4238a0b923820dcc509a6f75849b
print(hash_cry32('hello'))  # 5d41402abc4b2a76b9719d911017c592

5. Дата Python

Главы даты Python, представленные большими датамиcalendar, dateмодули, постепенно переходя к модулям, представляющим меньшие временные масштабы:datetime, timeМодули, расширенные в соответствии с этой логикой, обобщают наиболее часто используемые9Пример модуля обработки времени.

Иллюстрация календаря на 1 год

import calendar
year_calendar_str = calendar.calendar(2019)
print(f"{mydate.year}年的日历图:{year_calendar_str}\n")

распечатать результат:

2019

      January                   February                   March
Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su
    1  2  3  4  5  6                   1  2  3                   1  2  3
 7  8  9 10 11 12 13       4  5  6  7  8  9 10       4  5  6  7  8  9 10
14 15 16 17 18 19 20      11 12 13 14 15 16 17      11 12 13 14 15 16 17
21 22 23 24 25 26 27      18 19 20 21 22 23 24      18 19 20 21 22 23 24
28 29 30 31               25 26 27 28               25 26 27 28 29 30 31

       April                      May                       June
Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su
 1  2  3  4  5  6  7             1  2  3  4  5                      1  2
 8  9 10 11 12 13 14       6  7  8  9 10 11 12       3  4  5  6  7  8  9
15 16 17 18 19 20 21      13 14 15 16 17 18 19      10 11 12 13 14 15 16
22 23 24 25 26 27 28      20 21 22 23 24 25 26      17 18 19 20 21 22 23
29 30                     27 28 29 30 31            24 25 26 27 28 29 30

        July                     August                  September
Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su
 1  2  3  4  5  6  7                1  2  3  4                         1
 8  9 10 11 12 13 14       5  6  7  8  9 10 11       2  3  4  5  6  7  8
15 16 17 18 19 20 21      12 13 14 15 16 17 18       9 10 11 12 13 14 15
22 23 24 25 26 27 28      19 20 21 22 23 24 25      16 17 18 19 20 21 22
29 30 31                  26 27 28 29 30 31         23 24 25 26 27 28 29
                                                    30

      October                   November                  December
Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su
    1  2  3  4  5  6                   1  2  3                         1
 7  8  9 10 11 12 13       4  5  6  7  8  9 10       2  3  4  5  6  7  8
14 15 16 17 18 19 20      11 12 13 14 15 16 17       9 10 11 12 13 14 15
21 22 23 24 25 26 27      18 19 20 21 22 23 24      16 17 18 19 20 21 22
28 29 30 31               25 26 27 28 29 30         23 24 25 26 27 28 29
                                                    30 31

2 Определить, високосный ли год

import calendar
is_leap = calendar.isleap(mydate.year)
print_leap_str = "%s年是闰年" if is_leap else "%s年不是闰年\n"
print(print_leap_str % mydate.year)

распечатать результат:

2019年不是闰年

Иллюстрация календаря на март

import calendar
month_calendar_str = calendar.month(mydate.year, mydate.month)
print(f"{mydate.year}年-{mydate.month}月的日历图:{month_calendar_str}\n")

распечатать результат:

December 2019
Mo Tu We Th Fr Sa Su
                   1
 2  3  4  5  6  7  8
 9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31

сколько дней в апреле

import calendar
weekday, days = calendar.monthrange(mydate.year, mydate.month)
print(f'{mydate.year}年-{mydate.month}月的第一天是那一周的第{weekday}天\n')
print(f'{mydate.year}年-{mydate.month}月共有{days}天\n')

распечатать результат:

2019年-12月的第一天是那一周的第6天

2019年-12月共有31天

1 мая

from datetime import date
month_first_day = date(mydate.year, mydate.month, 1)
print(f"当月第一天:{month_first_day}\n")

распечатать результат:

当月第一天:2019-12-01

последний день июня

from datetime import date
import calendar
_, days = calendar.monthrange(mydate.year, mydate.month)
month_last_day = date(mydate.year, mydate.month, days)
print(f"当月最后一天:{month_last_day}\n")

распечатать результат:

当月最后一天:2019-12-31

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

from datetime import date, datetime
from time import localtime

today_date = date.today()
print(today_date)  # 2019-12-22

today_time = datetime.today()
print(today_time)  # 2019-12-22 18:02:33.398894

local_time = localtime()
print(strftime("%Y-%m-%d %H:%M:%S", local_time))  # 转化为定制的格式 2019-12-22 18:13:41

8 символов время от времени

from time import strptime

# parse str time to struct time
struct_time = strptime('2019-12-22 10:10:08', "%Y-%m-%d %H:%M:%S")
print(struct_time) # struct_time类型就是time中的一个类

# time.struct_time(tm_year=2019, tm_mon=12, tm_mday=22, tm_hour=10, tm_min=10, tm_sec=8, tm_wday=6, tm_yday=356, tm_isdst=-1)

9 Время до появления персонажа

from time import strftime, strptime, localtime

In [2]: print(localtime()) #这是输入的时间
Out[2]: time.struct_time(tm_year=2019, tm_mon=12, tm_mday=22, tm_hour=18, tm_min=24, tm_sec=56, tm_wday=6, tm_yday=356, tm_isdst=0)

print(strftime("%m-%d-%Y %H:%M:%S", localtime()))  # 转化为定制的格式
# 这是字符串表示的时间:   12-22-2019 18:26:21

Шесть, инструмент Python

Три основных инструмента в Python включают в себя:迭代器,生成器,装饰器, эффективно использовать их для разработки высокопроизводительной программы Python, встроенные модули, задействованныеitertoolsПредоставляет операции, связанные с итератором. Этот раздел содержит в общей сложности интересные примеры14пример.

1 Найдите n-е вхождение

def search_n(s, c, n):
    size = 0
    for i, x in enumerate(s):
        if x == c:
            size += 1
        if size == n:
            return i
    return -1



print(search_n("fdasadfadf", "a", 3))# 结果为7,正确
print(search_n("fdasadfadf", "a", 30))# 结果为-1,正确

2 Первые n членов последовательности Фибоначчи

def fibonacci(n):
    a, b = 1, 1
    for _ in range(n):
        yield a
        a, b = b, a + b


list(fibonacci(5))  # [1, 1, 2, 3, 5]

3 Найдите все повторяющиеся элементы

from collections import Counter


def find_all_duplicates(lst):
    c = Counter(lst)
    return list(filter(lambda k: c[k] > 1, c))


find_all_duplicates([1, 2, 2, 3, 3, 3])  # [2,3]

4 Совместная статистика

Между объектами счетчика можно выполнять математические операции.

from collections import Counter
a = ['apple', 'orange', 'computer', 'orange']
b = ['computer', 'orange']

ca = Counter(a)
cb = Counter(b)
#Counter对象间可以做数学运算
ca + cb  # Counter({'orange': 3, 'computer': 2, 'apple': 1})


# 进一步抽象,实现多个列表内元素的个数统计


def sumc(*c):
    if (len(c) < 1):
        return
    mapc = map(Counter, c)
    s = Counter([])
    for ic in mapc: # ic 是一个Counter对象
        s += ic
    return s


#Counter({'orange': 3, 'computer': 3, 'apple': 1, 'abc': 1, 'face': 1})
sumc(a, b, ['abc'], ['face', 'computer'])

5 groupby группировка по одному полю

Рекорд погоды:

a = [{'date': '2019-12-15', 'weather': 'cloud'},
 {'date': '2019-12-13', 'weather': 'sunny'},
 {'date': '2019-12-14', 'weather': 'cloud'}]

Следите за полем погодыweatherРезюме группы:

from itertools import groupby
for k, items in  groupby(a,key=lambda x:x['weather']):
     print(k)

Результаты вывода показывают, что группировка не удалась! Причина: Перед группировкой необходимо следить за полем группировки排序, это очень яма~

cloud
sunny
cloud

Измените код:

a.sort(key=lambda x: x['weather'])
for k, items in  groupby(a,key=lambda x:x['weather']):
     print(k)
     for i in items:
         print(i)

Выходной результат:

cloud
{'date': '2019-12-15', 'weather': 'cloud'}
{'date': '2019-12-14', 'weather': 'cloud'}
sunny
{'date': '2019-12-13', 'weather': 'sunny'}

6 функций получения элементов и клавиш

уведомлениеsortиgroupbyиспользовалkeyфункция, кромеlambdaВ дополнение к методу записи существует также стенография, которая заключается в использованииitemgetter:

a = [{'date': '2019-12-15', 'weather': 'cloud'},
 {'date': '2019-12-13', 'weather': 'sunny'},
 {'date': '2019-12-14', 'weather': 'cloud'}]
from operator import itemgetter
from itertools import groupby

a.sort(key=itemgetter('weather'))
for k, items in groupby(a, key=itemgetter('weather')):
     print(k)
     for i in items:
         print(i)

результат:

cloud
{'date': '2019-12-15', 'weather': 'cloud'}
{'date': '2019-12-14', 'weather': 'cloud'}
sunny
{'date': '2019-12-13', 'weather': 'sunny'}

7 groupby группировка по нескольким полям

itemgetterэто класс,itemgetter('weather')Возвращает вызываемый объект с несколькими аргументами:

from operator import itemgetter
from itertools import groupby

a.sort(key=itemgetter('weather', 'date'))
for k, items in groupby(a, key=itemgetter('weather')):
     print(k)
     for i in items:
         print(i)

Результат следующий, используяweatherиdateСортировать по двум полямa,

cloud
{'date': '2019-12-14', 'weather': 'cloud'}
{'date': '2019-12-15', 'weather': 'cloud'}
sunny
{'date': '2019-12-13', 'weather': 'sunny'}

Обратите внимание, что этот результат немного отличается от приведенного выше, это больше то, что мы хотим увидеть и использовать.

8 Функция суммы вычисляет и агрегирует одновременно

Агрегатные функции класса в Pythonsum,min,maxПервый параметрiterableТип, общее использование выглядит следующим образом:

a = [4,2,5,1]
sum([i+1 for i in a]) # 16

Используйте понимание списка[i+1 for i in a]Создайте длину сaВременный список из одной строки, после завершения этого шага выполнитеsumполимеризация.

Только представьте, если ваш массивaПри длине 10 миллионов такой временный список создавать нерентабельно, лучше агрегировать при расчете, и немного изменить его следующим образом:

a = [4,2,5,1]
sum(i+1 for i in a) # 16

В настоящее времяi+1 for i in aда(i+1 for i in a)сокращение для , чтобы получить генератор (generator) следующим образом:

In [8]:(i+1 for i in a)
OUT [8]:<generator object <genexpr> at 0x000002AC7FFA8CF0>

Генератор глохнет(yield) один элемент и вычисляется и агрегируется, переходите к следующей итерации до конечной точки.

9 группировка списков (версия генератора)

from math import ceil

def divide_iter(lst, n):
    if n <= 0:
        yield lst
        return
    i, div = 0, ceil(len(lst) / n)
    while i < n:
        yield lst[i * div: (i + 1) * div]
        i += 1

list(divide_iter([1, 2, 3, 4, 5], 0))  # [[1, 2, 3, 4, 5]]
list(divide_iter([1, 2, 3, 4, 5], 2))  # [[1, 2, 3], [4, 5]]

10 Полное раскрытие списка (Builder Edition)

#多层列表展开成单层列表
a=[1,2,[3,4,[5,6],7],8,["python",6],9]
def function(lst):
    for i in lst:
        if type(i)==list:
            yield from function(i)
        else:
            yield i
print(list(function(a))) # [1, 2, 3, 4, 5, 6, 7, 8, 'python', 6, 9]

11 Декоратор для проверки времени выполнения функции

#测试函数执行时间的装饰器示例
import time
def timing_func(fn):
    def wrapper():
        start=time.time()
        fn()   #执行传入的fn参数
        stop=time.time()
        return (stop-start)
    return wrapper
@timing_func
def test_list_append():
    lst=[]
    for i in range(0,100000):
        lst.append(i)  
@timing_func
def test_list_compre():
    [i for i in range(0,100000)]  #列表生成式
a=test_list_append()
c=test_list_compre()
print("test list append time:",a)
print("test list comprehension time:",c)
print("append/compre:",round(a/c,3))

test list append time: 0.0219423770904541
test list comprehension time: 0.007980823516845703
append/compre: 2.749

12 Декоратор, который подсчитывает количество и время исключений

Напишите декоратор, который подсчитывает время, прошедшее после повторения исключения заданное количество раз.

import time
import math


def excepter(f):
    i = 0
    t1 = time.time()
    def wrapper(): 
        try:
            f()
        except Exception as e:
            nonlocal i
            i += 1
            print(f'{e.args[0]}: {i}')
            t2 = time.time()
            if i == n:
                print(f'spending time:{round(t2-t1,2)}')
    return wrapper

Ключевые словаnonlocalЧасто используется при вложенности функций, объявляя переменную i нелокальной;

Если не объявлено,i+=1показыватьiдля функцииwrapperлокальные переменные внутриi+=1При обращении,iНе объявлено, поэтому будет сообщеноunreferenced variableошибка.

Используйте созданную функцию декоратораexcepter, nэто количество нештатных ситуаций.

Тестируются два распространенных типа исключений:被零除и数组越界.

n = 10 # except count

@excepter
def divide_zero_except():
    time.sleep(0.1)
    j = 1/(40-20*2)

# test zero divived except
for _ in range(n):
    divide_zero_except()


@excepter
def outof_range_except():
    a = [1,3,5]
    time.sleep(0.1)
    print(a[3])
# test out of range except
for _ in range(n):
    outof_range_except()

Напечатанный результат выглядит следующим образом:

division by zero: 1
division by zero: 2
division by zero: 3
division by zero: 4
division by zero: 5
division by zero: 6
division by zero: 7
division by zero: 8
division by zero: 9
division by zero: 10
spending time:1.01
list index out of range: 1
list index out of range: 2
list index out of range: 3
list index out of range: 4
list index out of range: 5
list index out of range: 6
list index out of range: 7
list index out of range: 8
list index out of range: 9
list index out of range: 10
spending time:1.01

13 пользовательских декрементирующих итераторов

#编写一个迭代器,通过循环语句,实现对某个正整数的依次递减1,直到0.
class Descend(Iterator):
    def __init__(self,N):
        self.N=N
        self.a=0
    def __iter__(self):
        return self 
    def __next__(self):
        while self.a<self.N:
            self.N-=1
            return self.N
        raise StopIteration
    
descend_iter=Descend(10)
print(list(descend_iter))
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]

Основные моменты:

1 __nex__Имя нельзя изменить, и реализована пользовательская логика итерации.

2 raise StopIteration: Чтобы прервать программу повышением, нужно написать так

14 Декоратор для выполнения тестов

#测试函数执行时间的装饰器示例
import time
def timing(fn):
    def wrapper():
        start=time.time()
        fn()   #执行传入的fn参数
        stop=time.time()
        return (stop-start)
    return wrapper

@timing
def test_list_append():
    lst=[]
    for i in range(0,100000):
        lst.append(i)  

@timing
def test_list_compre():
    [i for i in range(0,100000)]  #列表生成式

a=test_list_append()
c=test_list_compre()
print("test list append time:",a)
print("test list comprehension time:",c)
print("append/compre:",round(a/c,3))

# test list append time: 0.0219
# test list comprehension time: 0.00798
# append/compre: 2.749

Семь, рисунок Python

Обычно используемые инструменты рисования в Python включают в себя:matplotlib, seaborn, plotlyи т. д., а также некоторые другие пакеты, предназначенные для рисования определенных типов графиков, таких как графы облаков слов и т. д.turtleпакет и т. д. В этой главе будут использованы несколько примеров от простого к сложному, чтобы проиллюстрировать классические небольшие примеры рисования, в настоящее время включенные10Кусок.

1 черепаха рисует олимпийские кольца

Функция рисования черепахи очень проста в использовании. В принципе, вы можете узнать ее значение, увидев название функции. Используя черепаху ниже, для рисования диаграммы из пяти колец Олимпийских игр используется всего 15 строк кода.

1 Импортируйте библиотеку

import turtle

2 Определите функцию рисования круга

def drawCircle(x,y,c='red'):
    p.pu()# 抬起画笔
    p.goto(x,y) # 绘制圆的起始位置
    p.pd()# 放下画笔
    p.color(c)# 绘制c色圆环
    p.circle(30,360) #绘制圆:半径,角度

3 Основные настройки кисти

p = turtle
p.pensize(3) # 画笔尺寸设置3

4 Нарисуйте диаграмму с пятью кольцами

вызвать функцию круга

drawCircle(0,0,'blue')
drawCircle(60,0,'black')
drawCircle(120,0,'red')
drawCircle(90,-30,'green')
drawCircle(30,-30,'yellow')    

p.done()

результат:

[Ошибка загрузки изображения...(image-7c479f-1577689175382)]

2 черепаха рисует снежинки

модуль импорта

ИмпортироватьturtleБиблиотеки и питонrandom

import turtle as p
import random

рисовать снежинки

def snow(snow_count):
    p.hideturtle()
    p.speed(500)
    p.pensize(2)
    for i in range(snow_count):
        r = random.random()
        g = random.random()
        b = random.random()
        p.pencolor(r, g, b)
        p.pu()
        p.goto(random.randint(-350, 350), random.randint(1, 270))
        p.pd()
        dens = random.randint(8, 12)
        snowsize = random.randint(10, 14)
        for _ in range(dens):
            p.forward(snowsize)  # 向当前画笔方向移动snowsize像素长度
            p.backward(snowsize)  # 向当前画笔相反方向移动snowsize像素长度
            p.right(360 / dens)  # 顺时针移动360 / dens度

рисовать землю

def ground(ground_line_count):
    p.hideturtle()
    p.speed(500)
    for i in range(ground_line_count):
        p.pensize(random.randint(5, 10))
        x = random.randint(-400, 350)
        y = random.randint(-280, -1)
        r = -y / 280
        g = -y / 280
        b = -y / 280
        p.pencolor(r, g, b)
        p.penup()  # 抬起画笔
        p.goto(x, y)  # 让画笔移动到此位置
        p.pendown()  # 放下画笔
        p.forward(random.randint(40, 100))  # 眼当前画笔方向向前移动40~100距离

основная функция

def main():
    p.setup(800, 600, 0, 0)
    # p.tracer(False)
    p.bgcolor("black")
    snow(30)
    ground(30)
    # p.tracer(True)
    p.mainloop()

main()

Отображение результатов динамического графика:

Sample

3 wordcloud слово облако иллюстрация

import hashlib
import pandas as pd
from wordcloud import WordCloud
geo_data=pd.read_excel(r"../data/geo_data.xlsx")
print(geo_data)
# 0     深圳
# 1     深圳
# 2     深圳
# 3     深圳
# 4     深圳
# 5     深圳
# 6     深圳
# 7     广州
# 8     广州
# 9     广州

words = ','.join(x for x in geo_data['city'] if x != []) #筛选出非空列表值
wc = WordCloud(
    background_color="green", #背景颜色"green"绿色
    max_words=100, #显示最大词数
    font_path='./fonts/simhei.ttf', #显示中文
    min_font_size=5,
    max_font_size=100,
    width=500  #图幅宽度
    )
x = wc.generate(words)
x.to_file('../data/geo_data.png')

[Ошибка загрузки изображения...(image-78330d-1577689175382)]

4 сюжетно рисует гистограммы и линейные диаграммы

#柱状图+折线图
import plotly.graph_objects as go
fig = go.Figure()
fig.add_trace(
    go.Scatter(
        x=[0, 1, 2, 3, 4, 5],
        y=[1.5, 1, 1.3, 0.7, 0.8, 0.9]
    ))
fig.add_trace(
    go.Bar(
        x=[0, 1, 2, 3, 4, 5],
        y=[2, 0.5, 0.7, -1.2, 0.3, 0.4]
    ))
fig.show()
Sample

5 морских тепловых карт

# 导入库
import seaborn as sns
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

# 生成数据集
data = np.random.random((6,6))
np.fill_diagonal(data,np.ones(6))
features = ["prop1","prop2","prop3","prop4","prop5", "prop6"]
data = pd.DataFrame(data, index = features, columns=features)
print(data)
# 绘制热力图
heatmap_plot = sns.heatmap(data, center=0, cmap='gist_rainbow')
plt.show()

image.png

6 линейный график matplotlib

Имя модуля: example_utils.py, который включает в себя три функции, каждая из которых выглядит следующим образом:

import matplotlib.pyplot as plt

# 创建画图fig和axes
def setup_axes():
    fig, axes = plt.subplots(ncols=3, figsize=(6.5,3))
    for ax in fig.axes:
        ax.set(xticks=[], yticks=[])
    fig.subplots_adjust(wspace=0, left=0, right=0.93)
    return fig, axes
# 图片标题
def title(fig, text, y=0.9):
    fig.suptitle(text, size=14, y=y, weight='semibold', x=0.98, ha='right',
                 bbox=dict(boxstyle='round', fc='floralwhite', ec='#8B7E66',
                           lw=2))
# 为数据添加文本注释
def label(ax, text, y=0):
    ax.annotate(text, xy=(0.5, 0.00), xycoords='axes fraction', ha='center',
                style='italic',
                bbox=dict(boxstyle='round', facecolor='floralwhite',
                          ec='#8B7E66'))

image.png

import numpy as np
import matplotlib.pyplot as plt

import example_utils

x = np.linspace(0, 10, 100)

fig, axes = example_utils.setup_axes()
for ax in axes:
    ax.margins(y=0.10)

# 子图1 默认plot多条线,颜色系统分配
for i in range(1, 6):
    axes[0].plot(x, i * x)

# 子图2 展示线的不同linestyle
for i, ls in enumerate(['-', '--', ':', '-.']):
    axes[1].plot(x, np.cos(x) + i, linestyle=ls)

# 子图3 展示线的不同linestyle和marker
for i, (ls, mk) in enumerate(zip(['', '-', ':'], ['o', '^', 's'])):
    axes[2].plot(x, np.cos(x) + i * x, linestyle=ls, marker=mk, markevery=10)

# 设置标题
# example_utils.title(fig, '"ax.plot(x, y, ...)": Lines and/or markers', y=0.95)
# 保存图片
fig.savefig('plot_example.png', facecolor='none')
# 展示图片
plt.show()

7 график рассеяния matplotlib

image.png

Соответствующий код:

"""
散点图的基本用法
"""
import numpy as np
import matplotlib.pyplot as plt

import example_utils

# 随机生成数据
np.random.seed(1874)
x, y, z = np.random.normal(0, 1, (3, 100))
t = np.arctan2(y, x)
size = 50 * np.cos(2 * t)**2 + 10

fig, axes = example_utils.setup_axes()

# 子图1
axes[0].scatter(x, y, marker='o',  color='darkblue', facecolor='white', s=80)
example_utils.label(axes[0], 'scatter(x, y)')

# 子图2
axes[1].scatter(x, y, marker='s', color='darkblue', s=size)
example_utils.label(axes[1], 'scatter(x, y, s)')

# 子图3
axes[2].scatter(x, y, s=size, c=z,  cmap='gist_ncar')
example_utils.label(axes[2], 'scatter(x, y, s, c)')

# example_utils.title(fig, '"ax.scatter(...)": Colored/scaled markers',
#                     y=0.95)
fig.savefig('scatter_example.png', facecolor='none')

plt.show()

8 гистограмма matplotlib

image.png

Соответствующий код:

import numpy as np
import matplotlib.pyplot as plt

import example_utils


def main():
    fig, axes = example_utils.setup_axes()

    basic_bar(axes[0])
    tornado(axes[1])
    general(axes[2])

    # example_utils.title(fig, '"ax.bar(...)": Plot rectangles')
    fig.savefig('bar_example.png', facecolor='none')
    plt.show()

# 子图1
def basic_bar(ax):
    y = [1, 3, 4, 5.5, 3, 2]
    err = [0.2, 1, 2.5, 1, 1, 0.5]
    x = np.arange(len(y))
    ax.bar(x, y, yerr=err, color='lightblue', ecolor='black')
    ax.margins(0.05)
    ax.set_ylim(bottom=0)
    example_utils.label(ax, 'bar(x, y, yerr=e)')

# 子图2
def tornado(ax):
    y = np.arange(8)
    x1 = y + np.random.random(8) + 1
    x2 = y + 3 * np.random.random(8) + 1
    ax.barh(y, x1, color='lightblue')
    ax.barh(y, -x2, color='salmon')
    ax.margins(0.15)
    example_utils.label(ax, 'barh(x, y)')

# 子图3
def general(ax):
    num = 10
    left = np.random.randint(0, 10, num)
    bottom = np.random.randint(0, 10, num)
    width = np.random.random(num) + 0.5
    height = np.random.random(num) + 0.5
    ax.bar(left, height, width, bottom, color='salmon')
    ax.margins(0.15)
    example_utils.label(ax, 'bar(l, h, w, b)')


main()

9 контурный график matplotlib

image.png

Соответствующий код:

import matplotlib.pyplot as plt
import numpy as np
from matplotlib.cbook import get_sample_data

import example_utils

z = np.load(get_sample_data('bivariate_normal.npy'))

fig, axes = example_utils.setup_axes()

axes[0].contour(z, cmap='gist_earth')
example_utils.label(axes[0], 'contour')

axes[1].contourf(z, cmap='gist_earth')
example_utils.label(axes[1], 'contourf')

axes[2].contourf(z, cmap='gist_earth')
cont = axes[2].contour(z, colors='black')
axes[2].clabel(cont, fontsize=6)
example_utils.label(axes[2], 'contourf + contour\n + clabel')

# example_utils.title(fig, '"contour, contourf, clabel": Contour/label 2D data',
#                     y=0.96)
fig.savefig('contour_example.png', facecolor='none')

plt.show()

10 имшоу графиков

image.png

Соответствующий код:

import matplotlib.pyplot as plt
import numpy as np
from matplotlib.cbook import get_sample_data
from mpl_toolkits import axes_grid1

import example_utils


def main():
    fig, axes = setup_axes()
    plot(axes, *load_data())
    # example_utils.title(fig, '"ax.imshow(data, ...)": Colormapped or RGB arrays')
    fig.savefig('imshow_example.png', facecolor='none')
    plt.show()


def plot(axes, img_data, scalar_data, ny):

    # 默认线性插值
    axes[0].imshow(scalar_data, cmap='gist_earth', extent=[0, ny, ny, 0])

    # 最近邻插值
    axes[1].imshow(scalar_data, cmap='gist_earth', interpolation='nearest',
                   extent=[0, ny, ny, 0])

    # 展示RGB/RGBA数据
    axes[2].imshow(img_data)


def load_data():
    img_data = plt.imread(get_sample_data('5.png'))
    ny, nx, nbands = img_data.shape
    scalar_data = np.load(get_sample_data('bivariate_normal.npy'))
    return img_data, scalar_data, ny


def setup_axes():
    fig = plt.figure(figsize=(6, 3))
    axes = axes_grid1.ImageGrid(fig, [0, 0, .93, 1], (1, 3), axes_pad=0)

    for ax in axes:
        ax.set(xticks=[], yticks=[])
    return fig, axes


main()

11 рисунков PyCharts на панели инструментов

Для установки используйте pip install pyecharts, версия v1.6, pyecharts рисует панель инструментов, требуется всего несколько строк кода:

from pyecharts import charts

# 仪表盘
gauge = charts.Gauge()
gauge.add('Python小例子', [('Python机器学习', 30), ('Python基础', 70.),
                        ('Python正则', 90)])
gauge.render(path="./data/仪表盘.html")
print('ok')

Всего на панели управления отображается три элемента, и соотношение каждого элемента составляет 30 %, 70 % и 90%. Имя по умолчанию на следующем рисунке показывает первый элемент: машинное обучение Python с коэффициентом завершения 30. %.

image.png

12 воронкообразных диаграмм

from pyecharts import options as opts
from pyecharts.charts import Funnel, Page
from random import randint

def funnel_base() -> Funnel:
  c = (
    Funnel()
    .add("豪车", [list(z) for z in zip(['宝马', '法拉利', '奔驰', '奥迪', '大众', '丰田', '特斯拉'],
                 [randint(1, 20) for _ in range(7)])])
    .set_global_opts(title_opts=opts.TitleOpts(title="豪车漏斗图"))
  )
  return c
funnel_base().render('./img/car_fnnel.html')

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

image.png

13 круговых диаграмм календаря

import datetime
import random
from pyecharts import options as opts
from pyecharts.charts import Calendar

def calendar_interval_1() -> Calendar:
    begin = datetime.date(2019, 1, 1)
    end = datetime.date(2019, 12, 27)
    data = [
        [str(begin + datetime.timedelta(days=i)), random.randint(1000, 25000)]
        for i in range(0, (end - begin).days + 1, 2)  # 隔天统计
    ]
    calendar = (
      Calendar(init_opts=opts.InitOpts(width="1200px")).add(
            "", data, calendar_opts=opts.CalendarOpts(range_="2019"))
        .set_global_opts(
            title_opts=opts.TitleOpts(title="Calendar-2019年步数统计"),
            visualmap_opts=opts.VisualMapOpts(
                max_=25000,
                min_=1000,
                orient="horizontal",
                is_piecewise=True,
                pos_top="230px",
                pos_left="100px",
            ),
        )
    )
    return calendar

calendar_interval_1().render('./img/calendar.html')

Нарисуйте количество шагов с 1 января по 27 декабря 2019 года, официальную ширину графика900pxНедостаточно, его можно отображать только до сентября, в этом примере используетсяopts.InitOpts(width="1200px")произвести тонкую настройку иvisualmapПоказать все шаги через день:

image

14 круговых диаграмм рисуют график

import json
import os
from pyecharts import options as opts
from pyecharts.charts import Graph, Page

def graph_base() -> Graph:
    nodes = [
        {"name": "cus1", "symbolSize": 10},
        {"name": "cus2", "symbolSize": 30},
        {"name": "cus3", "symbolSize": 20}
    ]
    links = []
    for i in nodes:
        if i.get('name') == 'cus1':
            continue
        for j in nodes:
            if j.get('name') == 'cus1':
                continue
            links.append({"source": i.get("name"), "target": j.get("name")})
    c = (
        Graph()
        .add("", nodes, links, repulsion=8000)
        .set_global_opts(title_opts=opts.TitleOpts(title="customer-influence"))
    )
    return c

Постройте граф, в котором точка клиента 1 не имеет отношения к двум другим клиентам (link), то есть нет допустимых ребер:

image

15 круговых диаграмм водное поло

from pyecharts import options as opts
from pyecharts.charts import Liquid, Page
from pyecharts.globals import SymbolType

def liquid() -> Liquid:
    c = (
        Liquid()
        .add("lq", [0.67, 0.30, 0.15])
        .set_global_opts(title_opts=opts.TitleOpts(title="Liquid"))
    )
    return c

liquid().render('./img/liquid.html')

Значение карты водного поло[0.67, 0.30, 0.15]представляет рисунок ниже三个波浪线, обычно представляющий три процента:

image.png

16 круговых диаграмм

from pyecharts import options as opts
from pyecharts.charts import Pie
from random import randint

def pie_base() -> Pie:
    c = (
        Pie()
        .add("", [list(z) for z in zip(['宝马', '法拉利', '奔驰', '奥迪', '大众', '丰田', '特斯拉'],
                                       [randint(1, 20) for _ in range(7)])])
        .set_global_opts(title_opts=opts.TitleOpts(title="Pie-基本示例"))
        .set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}"))
    )
    return c

pie_base().render('./img/pie_pyecharts.html')

image.png

17 круговых диаграмм полярный сюжет

import random
from pyecharts import options as opts
from pyecharts.charts import Page, Polar

def polar_scatter0() -> Polar:
    data = [(alpha, random.randint(1, 100)) for alpha in range(101)] # r = random.randint(1, 100)
    print(data)
    c = (
        Polar()
        .add("", data, type_="bar", label_opts=opts.LabelOpts(is_show=False))
        .set_global_opts(title_opts=opts.TitleOpts(title="Polar"))
    )
    return c

polar_scatter0().render('./img/polar.html')

Полярные координаты выражаются как(夹角,半径), такой как (6,94), представляет точку с внутренним углом 6 и радиусом 94:

image.png

Облако слов из 18 круговых диаграмм

from pyecharts import options as opts
from pyecharts.charts import Page, WordCloud
from pyecharts.globals import SymbolType

words = [
    ("Python", 100),
    ("C++", 80),
    ("Java", 95),
    ("R", 50),
    ("JavaScript", 79),
    ("C", 65)
]

def wordcloud() -> WordCloud:
    c = (
        WordCloud()
        # word_size_range: 单词字体大小范围
        .add("", words, word_size_range=[20, 100], shape='cardioid')
        .set_global_opts(title_opts=opts.TitleOpts(title="WordCloud"))
    )
    return c

wordcloud().render('./img/wordcloud.html')

("C",65)Указывает, что язык C встречается в этой статистике 65 раз.

image.png

Гистограмма серии 19 круговых диаграмм

from pyecharts import options as opts
from pyecharts.charts import Bar
from random import randint

def bar_series() -> Bar:
    c = (
        Bar()
        .add_xaxis(['宝马', '法拉利', '奔驰', '奥迪', '大众', '丰田', '特斯拉'])
        .add_yaxis("销量", [randint(1, 20) for _ in range(7)])
        .add_yaxis("产量", [randint(1, 20) for _ in range(7)])
        .set_global_opts(title_opts=opts.TitleOpts(title="Bar的主标题", subtitle="Bar的副标题"))
    )
    return c

bar_series().render('./img/bar_series.html')

image.png

20 круговых диаграмм тепловой карты

import random
from pyecharts import options as opts
from pyecharts.charts import HeatMap

def heatmap_car() -> HeatMap:
    x = ['宝马', '法拉利', '奔驰', '奥迪', '大众', '丰田', '特斯拉']
    y = ['中国','日本','南非','澳大利亚','阿根廷','阿尔及利亚','法国','意大利','加拿大']
    value = [[i, j, random.randint(0, 100)]
             for i in range(len(x)) for j in range(len(y))]
    c = (
        HeatMap()
        .add_xaxis(x)
        .add_yaxis("销量", y, value)
        .set_global_opts(
            title_opts=opts.TitleOpts(title="HeatMap"),
            visualmap_opts=opts.VisualMapOpts(),
        )
    )
    return c

heatmap_car().render('./img/heatmap_pyecharts.html')

Фактическое описание тепловой карты представляет собой трехмерную взаимосвязь. Ось X представляет модель, а ось Y представляет страну. Значение цвета каждого цветового блока представляет объем продаж. Цветовая шкала отображается в нижний левый угол. Чем краснее цвет, тем больше объем продаж.

image.png

Восемь, битва с питоном

1 Настройка окружения

Различайте несколько понятий, которые белые люди легко путают: pycharm, интерпретатор python, установка conda, установка pip, резюмируя:

  • pycharmЭто интегрированная среда разработки (Integrated Development Environment, IDE), разработанная Python, которая не может выполнять код Python самостоятельно.
  • python解释器Это инструмент, который фактически выполняет код.Интерпретатор Python можно установить в pycharm.Как правило, перейдите на официальный сайт python, чтобы загрузить версию python3.7 или python3.8; если он был установленanaconda, который также должен включать определенную версию интерпретатора Python; pycharm настраивает интерпретатор Python на выбор любой из них.
  • anaconda python — это набор часто используемых пакетов, которые мы можем использоватьcondaКоманда очень удобна для установки различных пакетов Python.
  • conda安装: после того, как мы установили программное обеспечение anaconda, мы можем использовать команду conda для загрузки пакетов из источника anaconda (например, из зеркального источника USTC).
  • pip安装: метод, аналогичный установочному пакету python, установленному conda.

Изменить источник зеркала

Установить с помощьюcondaУстановка некоторых пакетов будет медленной или установка завершится ошибкой.Наиболее эффективным способом является изменение источника зеркала на домашний источник зеркала. Зеркальный источник Tsinghua использовался и раньше, но после 2019 года сервис был остановлен. Рекомендуется использовать зеркальный источник Университета науки и технологий Китая.

Сначала проверьте установленный источник зеркала, выполните команду в окне cmd:

conda config --show

Просмотр элементов конфигурацииchannels, если отображается сtsinghua, это означает, что установлено зеркало Цинхуа.

channels:
- https://mirrors.tuna.tsinghua.edu.cn/tensorflow/linux/cpu/
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/msys2/
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch/

Далее используйтеconda config --remove channels url地址Чтобы удалить зеркало Цинхуа, используйте следующую команду для удаления первого. Затем удалите все зеркальные источники по очереди.

conda config --remove channels https://mirrors.tuna.tsinghua.edu.cn/tensorflow/linux/cpu/

Добавьте доступный в настоящее время зеркальный источник USTC:

conda config --add channels https://mirrors.ustc.edu.cn/anaconda/pkgs/free/

И настроить отображение адреса канала при поиске:

conda config --set show_channel_urls yes

Чтобы убедиться, что зеркальный источник успешно установлен, выполнитеconda config --show,оказатьсяchannelsЗначения следующие:

channels:
  - https://mirrors.ustc.edu.cn/anaconda/pkgs/free/
  - defaults

Done~

2 Автоматическая массовая рассылка

Автоматическая массовая рассылка Python

import smtplib
from email import (header)
from email.mime import (text, application, multipart)
import time

def sender_mail():
    smt_p = smtplib.SMTP()
    smt_p.connect(host='smtp.qq.com', port=25)
    sender, password = '113097485@qq.com', "**************"
    smt_p.login(sender, password)
    receiver_addresses, count_num = [
        'guozhennianhua@163.com', 'xiaoxiazi99@163.com'], 1
    for email_address in receiver_addresses:
        try:
            msg = multipart.MIMEMultipart()
            msg['From'] = "zhenguo"
            msg['To'] = email_address
            msg['subject'] = header.Header('这是邮件主题通知', 'utf-8')
            msg.attach(text.MIMEText(
                '这是一封测试邮件,请勿回复本邮件~', 'plain', 'utf-8'))
            smt_p.sendmail(sender, email_address, msg.as_string())
            time.sleep(10)
            print('第%d次发送给%s' % (count_num, email_address))
            count_num = count_num + 1
        except Exception as e:
            print('第%d次给%s发送邮件异常' % (count_num, email_address))
            continue
    smt_p.quit()

sender_mail()

Уведомление: Почтовый ящик отправителя является почтовым ящиком qq, поэтому необходимо настроить службу SMTP в почтовом ящике qq.Когда настройка будет завершена, будет сгенерирован код авторизации, и этот код авторизации будет присвоен тексту в тексте.passwordПеременная.

Скриншот после отправки:

image.png

3 Бинарный поиск

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

Небольшое описание примера: существуетотсортированный массивarr, укажите интервал[left,right]диапазон, найти элементxЕсли он не существует, верните-1

бинарный поискbinarySearchРеализована основная логика

def binarySearch(arr, left, right, x):
    while left <= right:

        mid = int(left + (right - left) / 2); # 找到中间位置。求中点写成(left+right)/2更容易溢出,所以不建议这样写

        # 检查x是否出现在位置mid
        if arr[mid] == x:
            print('found %d 在索引位置%d 处' %(x,mid))
            return mid

            # 假如x更大,则不可能出现在左半部分
        elif arr[mid] < x:
            left = mid + 1 #搜索区间变为[mid+1,right]
            print('区间缩小为[%d,%d]' %(mid+1,right))

        # 同理,假如x更小,则不可能出现在右半部分
        elif x<arr[mid]:
            right = mid - 1 #搜索区间变为[left,mid-1]
            print('区间缩小为[%d,%d]' %(left,mid-1))

    # 假如搜索到这里,表明x未出现在[left,right]中
    return -1

существуетIpythonВ интерактивном интерфейсе вызовитеbinarySearchНебольшая демонстрация:

In [8]: binarySearch([4,5,6,7,10,20,100],0,6,5)
区间缩小为[0,2]
found 5 at 1
Out[8]: 1

In [9]: binarySearch([4,5,6,7,10,20,100],0,6,4)
区间缩小为[0,2]
区间缩小为[0,0]
found 4 at 0
Out[9]: 0

In [10]: binarySearch([4,5,6,7,10,20,100],0,6,20)
区间缩小为[4,6]
found 20 at 5
Out[10]: 5

In [11]: binarySearch([4,5,6,7,10,20,100],0,6,100)
区间缩小为[4,6]
区间缩小为[6,6]
found 100 at 6
Out[11]: 6

4 Сканировать данные о погоде и анализировать значения температуры

Сканировать данные о погоде и анализировать значения температуры

Материал предоставлен моим другом Юань Шао, спасибо!

очищенная html-структура

image.png

import requests
from lxml import etree
import pandas as pd
import re

url = 'http://www.weather.com.cn/weather1d/101010100.shtml#input'
with requests.get(url) as res:
    content = res.content
    html = etree.HTML(content)

Извлечение значений через модуль lxml

В некоторых случаях lxml более эффективен, чем разбор BeautifulSoup.

location = html.xpath('//*[@id="around"]//a[@target="_blank"]/span/text()')
temperature = html.xpath('//*[@id="around"]/div/ul/li/a/i/text()')

результат:

['香河', '涿州', '唐山', '沧州', '天津', '廊坊', '太原', '石家庄', '涿鹿', '张家口', '保定', '三河', '北京孔庙', '北京国子监', '中国地质博物馆', '月坛公
园', '明城墙遗址公园', '北京市规划展览馆', '什刹海', '南锣鼓巷', '天坛公园', '北海公园', '景山公园', '北京海洋馆']

['11/-5°C', '14/-5°C', '12/-6°C', '12/-5°C', '11/-1°C', '11/-5°C', '8/-7°C', '13/-2°C', '8/-6°C', '5/-9°C', '14/-6°C', '11/-4°C', '13/-3°C'
, '13/-3°C', '12/-3°C', '12/-3°C', '13/-3°C', '12/-2°C', '12/-3°C', '13/-3°C', '12/-2°C', '12/-2°C', '12/-2°C', '12/-3°C']

Создание объекта DataFrame

df = pd.DataFrame({'location':location, 'temperature':temperature})
print('温度列')
print(df['temperature'])

Обычное значение температуры парсинга

df['high'] = df['temperature'].apply(lambda x: int(re.match('(-?[0-9]*?)/-?[0-9]*?°C', x).group(1) ) )
df['low'] = df['temperature'].apply(lambda x: int(re.match('-?[0-9]*?/(-?[0-9]*?)°C', x).group(1) ) )
print(df)

Подробный захват создания подперсонажа

Помимо простой оценки совпадения, регулярные выражения также имеют мощную функцию извлечения подстрок. использовать()Представляет извлекаемую группу. Например:^(\d{3})-(\d{3,8})$Две группы определены соответственно, а код города и местный номер могут быть извлечены непосредственно из совпадающей строки.

m = re.match(r'^(\d{3})-(\d{3,8})$', '010-12345')
print(m.group(0))
print(m.group(1))
print(m.group(2))

# 010-12345
# 010
# 12345

Если группы определены в регулярном выражении, вы можетеMatchобъектgroup()метод извлечения подстроки.

уведомлениеgroup(0)всегда сырые струны,group(1),group(2)... представляет 1-ю, 2-ю, ... подстроки.

Конечный результат

Name: temperature, dtype: object
    location temperature  high  low
0         香河     11/-5°C    11   -5
1         涿州     14/-5°C    14   -5
2         唐山     12/-6°C    12   -6
3         沧州     12/-5°C    12   -5
4         天津     11/-1°C    11   -1
5         廊坊     11/-5°C    11   -5
6         太原      8/-7°C     8   -7
7        石家庄     13/-2°C    13   -2
8         涿鹿      8/-6°C     8   -6
9        张家口      5/-9°C     5   -9
10        保定     14/-6°C    14   -6
11        三河     11/-4°C    11   -4
12      北京孔庙     13/-3°C    13   -3
13     北京国子监     13/-3°C    13   -3
14   中国地质博物馆     12/-3°C    12   -3
15      月坛公园     12/-3°C    12   -3
16   明城墙遗址公园     13/-3°C    13   -3
17  北京市规划展览馆     12/-2°C    12   -2
18       什刹海     12/-3°C    12   -3
19      南锣鼓巷     13/-3°C    13   -3
20      天坛公园     12/-2°C    12   -2
21      北海公园     12/-2°C    12   -2
22      景山公园     12/-2°C    12   -2
23     北京海洋馆     12/-3°C    12   -3

image.png