बैकएंड इंजीनियरिंग और कार्यात्मक प्रोग्रामिंग के लिए Scala · पाठ

Multiple Generators

Nested iteration

पाठ 3, कुल 4 में से13 चरण

Multiple Generators, CoddyKit पर बैकएंड इंजीनियरिंग और कार्यात्मक प्रोग्रामिंग के लिए Scala का एक निःशुल्क पाठ है। यह 4 में से 3वाँ पाठ है। आप नीचे पूरा पाठ निःशुल्क पढ़ सकते हैं—फिर अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर के साथ ब्राउज़र में इसका व्यावहारिक अभ्यास कर सकते हैं। यह बैकएंड इंजीनियरिंग और कार्यात्मक प्रोग्रामिंग के लिए Scala सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। बैकएंड इंजीनियरिंग और कार्यात्मक प्रोग्रामिंग के लिए Scala पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

नेस्टेड पुनरावृत्ति को समतल बनाना

एक for-कॉम्प्रिहेन्शन में कई जनरेटर हो सकते हैं। प्रत्येक <- पंक्ति किसी संग्रह पर पुनरावृत्ति करती है। साथ मिलकर वे हर संयोजन बनाते हैं—यह एक तरह का नेस्टेड लूप है, जिसे समतल रूप में लिखा जाता है।

object Main {
  def main(args: Array[String]): Unit = {
    val pairs = for {
      x <- List(1, 2)
      y <- List('a', 'b')
    } yield (x, y)
    println(pairs)
  }
}

यह कार्तीय गुणनफल है

m और n आकार वाले दो जनरेटर m × n परिणाम बनाते हैं, यानी पूरा कार्तीय गुणनफल। पहला जनरेटर बाहरी लूप और दूसरा आंतरिक लूप होता है।

object Main {
  def main(args: Array[String]): Unit = {
    val grid = for {
      row <- 1 to 3
      col <- 1 to 3
    } yield s"r$row-c$col"
    println(grid.mkString(", "))
  }
}

आंतरिक जनरेटर बाहरी जनरेटर पर निर्भर हो सकता है

बाद वाला जनरेटर पहले वाले जनरेटरों द्वारा बाँधे गए मानों का उपयोग कर सकता है। साधारण कार्तीय गुणनफल में यह संभव नहीं है और यही एक कारण है कि for-कॉम्प्रिहेन्शन इतने लचीले होते हैं।

object Main {
  def main(args: Array[String]): Unit = {
    val upperTriangle = for {
      i <- 1 to 4
      j <- i to 4
    } yield (i, j)
    println(upperTriangle)
  }
}

तीन या अधिक जनरेटर

आप जितने चाहें उतने जनरेटर एक के ऊपर एक रख सकते हैं। तीन जनरेटर से तीन-स्तरीय नेस्टेड लूप बनता है, जो टपल या परिकलित मान उत्पन्न करता है।

object Main {
  def main(args: Array[String]): Unit = {
    val triples = for {
      a <- 1 to 2
      b <- 1 to 2
      c <- 1 to 2
    } yield (a, b, c)
    println(triples.size + " combinations")
    triples.foreach(println)
  }
}

प्रसिद्ध पाइथागोरस उदाहरण

एक प्रसिद्ध उपयोग: पाइथागोरस त्रिक खोजना। हम तीन संख्याओं पर पुनरावृत्ति करते हैं और केवल उन्हीं को रखते हैं जिनके लिए a*a + b*b == c*c हो, यानी कई जनरेटरों को एक गार्ड के साथ मिलाते हैं।

object Main {
  def main(args: Array[String]): Unit = {
    val triples = for {
      a <- 1 to 20
      b <- a to 20
      c <- b to 20
      if a * a + b * b == c * c
    } yield (a, b, c)
    triples.foreach(println)
  }
}

यह कैसे परिवर्तित होता है

कई जनरेटर नेस्टेड flatMap कॉल और अंत में एक map में बदल जाते हैं:

  • xs.flatMap(x => ys.flatMap(y => zs.map(z => ...)))

हर अतिरिक्त जनरेटर एक और नेस्टेड स्तर जोड़ता है।

object Main {
  def main(args: Array[String]): Unit = {
    val sugar = for {
      x <- List(1, 2)
      y <- List(3, 4)
    } yield x * y
    val desugared = List(1, 2).flatMap(x => List(3, 4).map(y => x * y))
    println(sugar == desugared)
  }
}

जनरेटर और गार्ड को मिलाना

आप जनरेटर और गार्ड को स्वतंत्र रूप से एक-दूसरे के बीच रख सकते हैं। दो जनरेटरों के बीच रखा गया गार्ड आंतरिक लूप के चलने से पहले ही बाहरी मानों को हटा देता है।

object Main {
  def main(args: Array[String]): Unit = {
    val result = for {
      x <- 1 to 5
      if x % 2 == 1
      y <- 1 to 5
      if y > x
    } yield (x, y)
    println(result)
  }
}

नेस्टेड संग्रहों को समतल करना

जब आपके पास संग्रहों का संग्रह हो, तो दो जनरेटर उसे स्वाभाविक रूप से समतल कर देते हैं: पहला बाहरी संग्रह पर और दूसरा प्रत्येक आंतरिक संग्रह पर पुनरावृत्ति करता है।

object Main {
  def main(args: Array[String]): Unit = {
    val matrix = List(List(1, 2), List(3, 4), List(5, 6))
    val flat = for {
      row <- matrix
      value <- row
    } yield value
    println(flat)
  }
}

स्ट्रिंग ग्रिड बनाना

संरचित आउटपुट, जैसे निर्देशांक या गुणन सारणी, बनाने के लिए कई जनरेटर बहुत उपयोगी होते हैं।

object Main {
  def main(args: Array[String]): Unit = {
    val table = for {
      i <- 1 to 3
      j <- 1 to 3
    } yield s"$i*$j=${i * j}"
    println(table.grouped(3).map(_.mkString("  ")).mkString("\n"))
  }
}

अलग-अलग आकार वाले संग्रहों को मिलाना

जनरेटरों की लंबाई समान होना आवश्यक नहीं है। प्रत्येक संग्रह से एक तत्व लेकर बनने वाला हर संयोजन उत्पन्न किया जाता है।

object Main {
  def main(args: Array[String]): Unit = {
    val sizes = List("S", "M", "L")
    val colors = List("red", "blue")
    val products = for {
      s <- sizes
      c <- colors
    } yield s"$c-$s"
    println(products)
  }
}

क्रम आउटपुट अनुक्रम को प्रभावित करता है

जनरेटरों का क्रम बदलने पर संयोजनों का वही समुच्चय रहता है, लेकिन उनका क्रम बदल जाता है, क्योंकि अंतिम जनरेटर सबसे तेज़ी से बदलता है।

object Main {
  def main(args: Array[String]): Unit = {
    val ab = for { x <- List(1, 2); y <- List(9, 8) } yield (x, y)
    val ba = for { y <- List(9, 8); x <- List(1, 2) } yield (x, y)
    println(ab)
    println(ba)
  }
}

त्वरित जाँच

for { x <- List(1,2,3); y <- List('a','b') } yield (x, y) कितने टपल उत्पन्न करता है?

पुनरावृत्ति

आपने कई जनरेटरों के बारे में सीखा:

  • हर <- पंक्ति नेस्टेड पुनरावृत्ति का एक स्तर जोड़ती है
  • साथ मिलकर वे कार्तीय गुणनफल बनाते हैं
  • आंतरिक जनरेटर बाहरी रूप से बाँधे गए मानों पर निर्भर हो सकते हैं
  • वे नेस्टेड flatMap और अंत में एक map में बदल जाते हैं
  • जनरेटरों का क्रम परिणामों का क्रम बदल देता है
शुरुआत निःशुल्क

एआई शिक्षक के साथ Scala सीखें — निःशुल्क

अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।

पाठ्यक्रम
39
पाठ
143

अक्सर पूछे जाने वाले प्रश्न

क्या “Multiple Generators” पाठ निःशुल्क है?

हाँ—“Multiple Generators” का पूरा पाठ यहाँ वेब पर निःशुल्क पढ़ा जा सकता है। इंटरैक्टिव अभ्यास (अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर) करने और बैकएंड इंजीनियरिंग और कार्यात्मक प्रोग्रामिंग के लिए Scala पाठ्यक्रम का बाकी हिस्सा अनलॉक करने के लिए CoddyKit PRO लें। बैकएंड इंजीनियरिंग और कार्यात्मक प्रोग्रामिंग के लिए Scala पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

“Multiple Generators” में मैं क्या सीखूँगा?

Nested iteration आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ बैकएंड इंजीनियरिंग और कार्यात्मक प्रोग्रामिंग के लिए Scala का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।

क्या बैकएंड इंजीनियरिंग और कार्यात्मक प्रोग्रामिंग के लिए Scala शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?

पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर बैकएंड इंजीनियरिंग और कार्यात्मक प्रोग्रामिंग के लिए Scala शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 3वाँ पाठ है।

“Multiple Generators” पाठ पूरा करने में कितना समय लगता है?

CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।

क्या मैं इस बैकएंड इंजीनियरिंग और कार्यात्मक प्रोग्रामिंग के लिए Scala पाठ में कोड लिख और चला सकता हूँ?

हाँ। हर बैकएंड इंजीनियरिंग और कार्यात्मक प्रोग्रामिंग के लिए Scala पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।

इस पाठ्यक्रम के सभी पाठ

  1. for का Desugaring
  2. if से Filtering
  3. Multiple Generators
  4. Option और Future के साथ Using
← बैकएंड इंजीनियरिंग और कार्यात्मक प्रोग्रामिंग के लिए Scala पर वापस जाएँ