मुख्य Python · #11 / 11

Python Core (Advanced)

Iterators, generators, exceptions, files, modules

यह क्यों मायने रखता है

यही वह असली-दुनिया का औज़ार-बक्सा है जो Python को बड़े पैमाने पर उत्पादक बनाता है।

मूल विचार

Iterables आपको डेटा को आलस से (lazily) स्ट्रीम करने देते हैं (विशाल / अनंत sequences के लिए अच्छा)। Generators एक iterator लिखने का सबसे सस्ता तरीक़ा हैं। Exceptions error जाँच बिखेरे बिना विफलता का संकेत देते हैं। Context managers (with) सफ़ाई की गारंटी देते हैं।

आज़माकर देखिए

yield के साथ generators — मानों को आलस से बनाएँ:

def fib():
  a, b = 0, 1
  while True:
      yield a
      a, b = b, a + b

g = fib()
first_ten = [next(g) for _ in range(10)]
print(first_ten)
not loaded

Generator expressions बनाम list comprehensions — वही syntax, आलसी मूल्यांकन:

# Total memory: O(1) for the generator, O(n) for the list
nums = range(1_000_000)
total = sum(x * x for x in nums if x % 3 == 0)
print("sum of squares of multiples of 3:", total)
not loaded

Exceptions + try/except/else/finally:

def safe_div(a, b):
  try:
      result = a / b
  except ZeroDivisionError:
      return None
  except TypeError as e:
      return f"type error: {e}"
  else:
      return result
  finally:
      # runs no matter what — log, close files, etc.
      pass

print(safe_div(10, 2))
print(safe_div(10, 0))
print(safe_div(10, "x"))
not loaded

Standard library की ज़रूरी चीज़ें

आपको शायद ही कभी data structures शून्य से लिखने पड़ते हैं — standard library में तेज़ संस्करण मौजूद हैं:

Typing hints + dataclasses

Type hints इरादे को दस्तावेज़ करते हैं (और editors / type checkers को शक्ति देते हैं); @dataclass आपके लिए वह दोहरावदार __init__ / __repr__ लिख देता है:

from dataclasses import dataclass

def add(a: int, b: int) -> int:
    return a + b

@dataclass
class Point:
    x: int
    y: int

झटपट जाँच

छोटे अभ्यास

क्या करें और क्या न करें

और गहराई में — कस्टम iteration

कोई भी object जो __iter__ (iterator लौटाता है) और __next__ (अगला मान देता है या StopIteration raise करता है) लागू करता है, वह for loop में काम करता है:

class CounterIter:
    def __init__(self, n):
        self.n = n
        self.i = 0

    def __iter__(self):
        return self

    def __next__(self):
        if self.i >= self.n:
            raise StopIteration
        val = self.i
        self.i += 1
        return val

आम ग़लतियाँ

मुख्य बातें