Перевод статьи «Most Frequent Python Problems and Solution» с сайта pamno.com.

Мы проанализировали Stack Overflow на предмет наиболее часто встречающихся проблем и резюмировали ответы.

1. Как мне проверить, существует ли файл, используя Python, без использования try оператора?


Совместимо с Python 2.x/3:

  import os

  print os.path.isfile(fname)

2. Лучший способ проверить список на пустоту


Совместимо с Python 2.x/3:

  li=[]

  if not li:

     print “empty"


3. Хороший способ дополнить строку нулями


Совместимо с Python 2.7/3.x:

  “12345”.zfill(10)

*прим переводчика: функция string.zfill() возвращает строку, дополненную нулями слева, если её длина меньше заданной.

4. Как можно узнать имеет ли объект атрибут в Python?


2.7/3.x:

hasattr(a,’attributename’)


5. Поймать несколько исключений в одной строке


Совместимо с Python 2.6 и выше:

except (Exception1, Exception2) as e:

     pass

6. Как получить список всех файлов из каталога в Python?


Совместимо с Python 2.7/3:

import os

os.listdir()

7. Как сделать отсортированный список по значениям из Словаря?


Совместимо с Python 2.x и 3.x:

newlist = sorted(list_to_be_sorted, key=lambda k: k['name'])

8. Как разбить список на части одинакового размера?


def chunks(l, n):

""" Yield successive n-sized chunks from l. """

    for i in xrange(0, len(l), n):

        yield l[i:i+n]

9. Как скачать файл по протоколу http?


import urllib2

urllib2.urlopen('http://www.example.com/').read()

10. Умножение матриц в Python


Совместимо с Python 2.x:

def matmult(a,b):

    zip_b = zip(*b)

    return [[sum(ele_a*ele_b for ele_a, ele_b in zip(row_a, col_b)) for col_b in zip_b] for row_a in a]

11. Список всех простых чисел меньше N


Совместимо с Python 2.x:

def primes(n):

   """ Returns  a list of primes < n """

   sieve = [True] * n

   for i in range(3,int(n**0.5)+1,2):

       if sieve[i]:

           sieve[i*i::2*i]=[False]*((n-i*i-1)/(2*i)+1)

           return [2] + [i for i in xrange(3,n,2) if sieve[i]]

12. Алгоритм бинарного поиска в Python


def binary_search(array, target):

   lower = 0
   upper = len(array)

   while lower < upper:   # use < instead of <=

       x = lower + (upper - lower) // 2
       val = array[x]

       if target == val:
           return x
       elif target > val:

           if lower == x:   # this two are the actual lines
               break        # you're looking for
           lower = x

       elif target < val:
           upper = x

Комментарии (10)


  1. gwer
    29.09.2015 11:18
    +37

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


  1. stavinsky
    29.09.2015 12:56
    +2

    1. да конечно не используя try. Не поленился и зашел в IDE:

    # This follows symbolic links, so both islink() and isdir() can be true
    # for the same path on systems that support symlinks
    def isfile(path):
        """Test whether a path is a regular file"""
        try:
            st = os.stat(path)
        except os.error:
            return False
        return stat.S_ISREG(st.st_mode)
    


    А вообще присоединюсь к предыдущему оратору.


  1. captain_obvious
    29.09.2015 13:26
    +6

    Боги, какой жуткий бинпоиск.
    А вообще,

    import bisect
    


    1. SKolotienko
      29.09.2015 18:52
      +2

      + к умножению матриц import numpy


    1. lukyoung
      30.09.2015 06:08

      не могли бы вы пояснить в чем именно «жуть»?


      1. captain_obvious
        05.10.2015 11:59

        def bisect_left(a, x):
            lo, hi = 0, len(a)
            while lo < hi:
                mid = (lo+hi)//2
                if a[mid] < x:
                    lo = mid+1
                else:
                    hi = mid
            return lo
        


  1. pavelsh
    30.09.2015 08:21

    А что, умножение матриц в Питоне такое частое?


    1. stavinsky
      30.09.2015 11:08

      Ага 3 года каждый день тем и занимаюсь, сижу матрице в CherryPy умножаю)


    1. grossws
      30.09.2015 13:25

      Огромные толпы народа используют python для более-менее интерактивной обработки данных. В частности, в области ML, где умножение матриц — вполне стандартная штука. Другой вопрос, что обычно используется цивильный numpy.


  1. xmm
    03.10.2015 14:14

    этот поиск простых чисел начинает работать только с n=9