Yineluvchilar

By 08.09.2021 08.09.2021

(Avval sifatida tanilgan Iterators zarf ) Q iteratsiyada asosiy vositasi va ITERATE deyarli barcha hollarda eng samarali yo'lidir. Looplar q dasturlarida kam uchraydi va deyarli har doim optimallashtirish uchun nomzodlardir. Yineleme ustalari asosiy q mahoratidir.

Ushbu maqolaning birinchi qismida iteratorlar norasmiy tarzda tanishtiriladi. Bu iteratsiyaning ikkita asosiy shakliga tayyor kirishni ta'minlaydi: xaritalar va akkumulyatorlar .

Maqolaning ikkinchi qismida iteratorlarni yanada rasmiy va sintaksisga ko'proq e'tibor qaratiladi. Biz iteratorlar nafaqat funktsiyalarga, balki ro'yxatlar, lug'atlar va jadvallarga ham qo'llanilishini ko'ramiz. Qachon qavs kerak va nima uchun ularning sintaksisidan ko'ramiz.

Biz ulardan foydalanish misollarini muhokama qilamiz.

Asosiysi

Iteratorlar-bu yuqori darajali yagona operatorlar: ular bitta argumentni oladi va olingan funktsiyani qaytaradi. Bitta argument - bu qo'llaniladigan qiymat : ro'yxat, lug'at, jadval, ishlov berish dastagi yoki funktsiya. Olingan funktsiya uning normal qo'llanilishini takrorlaydi.

Iteratorlar postfiksni qo'llash mumkin bo'lgan yagona operatorlardir. Ular deyarli har doim.

Masalan, qo'shish operatoriga qo'llaniladigan yozilgan \ yozish \ iteratori qo'shilgan qo'shilgan funktsiyasini oladi, bu yozilgan + \ birikmasini qaytarish uchun Qo'shadi.

Multiply operatoriga * qo'llanilsa, u biriktirilgan mahsulotlarni qaytaradigan * \ yozilgan Multiply Scan funktsiyasini oladi.

(Ba'zi boshqa dasturlash tillari Yozuvchilar sifatida ko'rish bu foydalanish tan mumkin barobar .)

Yana bir misol. Birlashtiruvchi operatoriga tatbiq qilingan "yozilgan" har bir iteratori har biriga qo'shilish funktsiyasini yozadi, yozadi.

Yuqorida, a va b ikkalasi 2 × 3 belgidan iborat matritsalar. Ya'ni, ular ikkalasi ham 2-ro'yxat va ularning elementlari 3-ro'yxatdir. A, b ikkita ro'yxatga qo'shilsa, 4-ro'yxatni tuzadi, "a", "b" qo'shma funktsiyasi ikkita elementli 6-ro'yxatni yaratish uchun ularga mos keladigan elementlarga qo'shiladi.

Skanerlash va har biri - bu akkumulyator va xarita yinelatorlarining yadrolari. Boshqa iteratorlar ularning variantlari.

Uch xil takrorlash

Atomning takrorlanishi

Ko'pgina mahalliy q operatorlarida iteratsiya o'rnatilgan. Ular atomik. Ular mos keladigan dalillar uchun qo'llaniladi.

Agar ular bir xil uzunlikdagi ro'yxatlar bo'lsa yoki bitta yoki ikkalasi atom bo'lsa, ikkita argument mos keladi. Atom iteratsiyasida bu ta'rif har qanday uyalash chuqurligiga to'g'ri keladi .

Atomning takrorlanishi ichki tuzilishga chuqur kirib borgani uchun uni parallellashtirish oson emas. Buning oddiy shakli.

Xaritalash

Xarita iteratorlari funktsiyani ro'yxat yoki ro'yxat elementlari bo'ylab qo'llaydilar. Ular ichki tuzilishga kirmaydilar, balki uning yuqori sathidan o'tadilar. Hammaaynan shunday qiladi.

Har bir iteratorda to'rtta variant mavjud. Har bir o'ng/: funktsiyasi o'z argumentining har bir elementiga butun chap argumentini qo'llaydi. Shunga mos ravishda, Har Left\: funktsiyasi o'z argumentini chap argumentining har bir bandiga qo'llaydi.

Har bir chap va har bir o'ng

Esda tutingki, chiziq qaysi tomonga egilgan.

Har bir Priorargument sifatida ikkilik qiymatni oladi. Olingan funktsiya bir xil: u ro'yxatning (yoki lug'atning) har bir elementi va undan oldingi element o'rtasidagi ikkilikni qo'llaydi. Raqamli yoki vaqtinchalik vektordagi elementlar orasidagi farq:

Har bir parallelbir xil argumentni qabul qiladi va uni har bir kabi, olingan funktsiya argumentidagi har bir elementga qo'llaydi. Har biridan farqli o'laroq, u o'z ishini har qanday mavjud bo'lgan ikkinchi darajali jarayonlar o'rtasida taqsimlaydi. Aytaylik, tahlil CPU-ni talab qiladi va argument sifatida bitta belgi atomini oladi.

Bir funktsiyali funktsiyaga ega bo'lgan holda, har birining mnemonik kalit so'zlari, har birining iteratori uchun muqova sifatida afzal ko'riladi. Xuddi shunday, har bir oldingi uchun oldingi va har bir parallel uchun shaftoli afzaldir.

Xarita iteratorlari yordamida baholashlar soni-olingan funktsiya argumentlari/sidagi yuqori darajadagi elementlar soni. Bu funktsiyalar bir xil.

Xaritani qaytaruvchi:

glif ism mnemonik kalit so'z
' Har biri har biri
\: Har bir chap
/: Har bir o'ng
': Har bir oldingi oldingi
': Har bir parallel shaftoli
' Koson

Yig'ish

Akkumulyator yinelemalarida qiymat qayta -qayta qo'llaniladi, birinchi navbatda olingan funktsiyaning butun (birinchi) argumentiga, bu baholash natijasi yoniga va hokazo.

Baholar soni qiymat darajasiga qarab belgilanadi.

A uchun terimliqiymati, uch shakllar mavjud:

  • Birlashtirish: natija oldingi natijaga yoki asl argumentga mos kelguncha takrorlang
  • Amalga oshiring: belgilangan marta takrorlang
  • Vaqt: natija sinovdan o'tmaguncha takrorlang

Yuqori darajadagiqiymatlar uchun baholar soni to'g'ri argument/sonlarning soni hisoblanadi. Masalan, x, y va z argumentlariga f \ u003d uchlamchi funktsiyani qo'llash natijasi:

Biz shuni ko'ramizki, to'g'ri argumentlar y va z mos bo'lishi kerak va r - baholar soni - hisob [y] | hisob [z].

Ikkita akkumulyator iteratori mavjud.

  • Scan\ funktsiyalari har bir baholash natijalarini ro'yxat sifatida qaytaradi. Shunday qilib, ular to'g'ri funktsiyalardir: ularning natijalari to'g'ri argumentlarga mos keladi. Ular o'xshash yo'l ba'zi boshqa dasturlash tillarida.
  • Over/ funktsiyalari Scan funktsiyalari bilan bir xil hisob -kitoblarni bajaradi, lekin faqat oxirgi natijani qaytaradi. Ular boshqa dasturlash tillarida xaritani qisqartirishga o'xshaydi .

Scan va Over va ikkilik qiymatlarda, odatda, mnemonic kalit so'zlarni skanerlash va tugatish afzallik beriladi.

glif ism mnemonik kalit so'z
\ Skanerlash skanerlash
/ Ustida ustida

Qavslar va qavslar

Qiymatga iteratorni qo'llash natijasi - hosil qilingan funksiya. Boshqa har qanday funktsiya singari, olingan funktsiyani qavslar yordamida qo'llash mumkin.

E'tibor bering, bu erda olingan funktsiya xilma -xil : u unariar yoki ikkilik sifatida qo'llanilishi mumkin.

Postfiks infix hosil qiladi

Posteratordan keyin qo'llaniladigan takrorlovchi infix sintaksisli funktsiyani oladi.

Bu, olingan funktsiya darajasidan qat'i nazar, to'g'ri. Masalan, count 'unary funktsiyasi, lekin infix sintaksisiga ega.

Bundan tashqari, +\ ni ikkilik sifatida infix sintaksisidan foydalanishimiz mumkin.

Q sintaksisi amallar ketma -ketligini aniq ifodalashga imkon beradi. Primus funktsiyasini x ga, keyin natijaga sekundusni, keyin natijasiga tertiusni qo'llash uchun biz yozishimiz mumkin:

lekin yagona uslub prefiksini qo'llash va yozish yaxshiroq bo'lar edi:

Yaxshi q uslubi qavs va qavslardan foydalanishni kamaytiradi. (Qaerdan foydalanish kerak bo'lsa, ochiladigan qavs yoki qavs o'rtasida qanchalik kam bo'lsa, uning yaqinida ham shuncha yaxshi bo'ladi.) Shunday qilib, prefiksni qo'llash odatda yaxshi bo'ladi.

Infix funktsiyasini prefiksni qavslar yordamida unary sifatida qo'llash mumkin.

Ba'zi umumiy olingan funktsiyalar o'qilishi uchun kalit so'zlar bilan qoplangan. Yaxshi q uslubi ularni afzal ko'radi.

Har bir iterator bir xil qiymatlar uchun kalit so'z bilan qoplangan. Yaxshi q uslubi uni afzal ko'radi.

Infix funktsiyasini boshqa funktsiyaning chap argumenti sifatida ishlatish uchun parentez qiling.

Xarita yineluvchilari

Har biri, har biri parallel

Har bir iterator argumentning har bir elementiga unaryni qo'llaydi.

Ikkilik qiymatga ega bo'lgan holda, iterator ba'zida ikkalasi sifatida ham tanilgan . Siz uni argumentlaridan elementlar juftligi orasidagi qiymatni qo'llagan holda, fermuar mahkamlagichi deb hisoblashingiz mumkin.

Har bir parallel iterator bir xil qiymatlarni oladi. U har biri tomonidan ishlab chiqarilgan funktsiyalar bilan bir xil hisob -kitoblarni bajaradigan funktsiyalarni oladi, lekin agar mavjud bo'lsa, ikkinchi darajali vazifalarni bajaradi.

Yaxshi q uslubi shaftoli kalit so'zidan foydalanishni afzal ko'radi.

Har bir iteratorda ikkilik qiymatlarni argument sifatida qabul qiladigan uchta variant mavjud: har bir chap, har bir o'ng va har bir oldingi.

Har bir chap, har bir o'ng

Har bir va ikkilikdan olingan funktsiya bilan, agar ikkita argumentdan biri atom bo'lsa, u boshqa argumentning har bir elementi bilan bog'lanadi.

Bu xatti-harakatni atom bo'lmagan argumentlarga kengaytirish uchun Har bir chap yoki har o'ngdan foydalaning.

Masalan, jadvalning har bir ustunining fayl dastagini toping.

Jadvalning fayl dastagi ustunlar ro'yxatidagi har bir elementga qo'shilib, beshta 2 ta ro'yxatni yaratadi. Har bir o'ng iterator har bir ustunning fayl tutqichlarini yaratish uchun sv kalit so'zini ishlatishi mumkin.

Har bir oldingi

The Every Prior iterator o'z ikkilikini x ro'yxatining har bir elementiga va oldingi elementga qo'llaydi; ya'ni ro'yxatdagi har bir qo'shni juftlikka. Natijada x bilan bir xil uzunlikdagi ro'yxat paydo bo'ladi: olingan funktsiya bir xil funktsiyadir.

Yaxshi q uslubi oldingi kalit so'zdan foydalanishni afzal ko'radi.

-': dan foydalanish juda keng tarqalgan bo'lib, u deltalar kalit so'zi sifatida yaratilgan.

Yagona funktsiya sifatida -': ro'yxatni argument sifatida qaytaradi. Natijaning birinchi bandi argumentning birinchi bandiga to'g'ri keladi. Ammo, ta'rifga ko'ra, argumentning birinchi bandida oldingi element yo'q. Shunday qilib, \ (4-y \) ifodasida \ (y \) nima? Yuqorida nolga teng. Nol - ayirish uchun identifikator elementi: \ (y \) nol bo'lganda, \ (xy \) har doim \ (x \) bo'ladi. (Ma'lumotnomadagi "Har bir ustuni" ga qarang va identifikatsiya elementi bo'lmagan qiymatlar bilan nima sodir bo'ladi.)

Biz foydalanishimiz mumkin Har bir Oldin topgan juftlarni ko'rsatish.

Bu erda biz birinchi element 0, 0N bilan bog'langanligini ko'ramiz. Birlashish operatorida identifikator elementi yo'q, shuning uchun u protokol sifatida til 5 argumentidan foydalanadi.

Ma'lumotnomadagi jadval bizga har bir ikkilik qiymat bilan variadik funktsiyani olishini aytadi. Shunday qilib, har bir ustunni olib tashlash ikkilik sifatida ham qo'llanilishi mumkin.

Nol chap argumenti "urug '" - \ (y \) birinchi elementdan chiqariladi, 4. Biz boshqa "urug'" qiymatidan foydalanishimiz mumkin.

E'tibor bering, urug 'natijaning birinchi elementi turini o'zgartirganda, suzgichdan foydalaning. Ammo faqat birinchi element: natija endi vektor emas, balki aralash ro'yxat.

Har bir Prior bir xil bo'lishi kerak bo'lgan ro'yxatlardagi xatolarni kuzatishda foydali bo'lishi mumkin, masalan, ajratilgan ma'lumotlar bazasidagi jadval uchun .d fayllari. .D fayllaridagi nomuvofiqliklarni tekshirish uchun differ kalit so'zidan foydalanamiz. Har bir oldingi iteratordan foydalanadi va unga tengdir

.D fayllarining qiymatlari har bir bo'limdan chiqariladi. Keyin differ kalit so'zi har bir elementni oldingi bilan solishtiradi. Agar .d fayli ro'yxatdagi oldingi .d faylidan farq qilsa, u sana qaytariladi. Natijaning birinchi bandi qoldiriladi, chunki x ro'yxatning birinchi bandi x [-1] bilan taqqoslanadi, u har doim nol bo'ladi va shuning uchun hech qachon mos kelmaydi. Yuqoridagi misolda, 2013.05.03 va 2013.05.04 bo'limlari uchun .d fayllari farq qiladi va ularni qo'shimcha tekshirish kerak.

Yuqori martabalar

Har bir parallel, shaftoli va har biri bir xil qiymatlarni qo'llaydi. Har bir chap, har bir o'ng, har bir oldingi va oldingi ikkilik qiymatlarni qo'llang.

Har bir iterator har qanday darajadagi qiymatlarni qo'llaydi.

Atom iteratsiyasida bo'lgani kabi, argumentlar mos bo'lishi kerak: agar ro'yxatlar, ularning uzunligi mos bo'lsa; agar atomlar bo'lsa, ular ro'yxat/s uzunligiga takrorlanadi.

Qayta yig'uvchilar

Ikkita biriktiruvchi iterator (yoki akkumulyator ) bor va ular aslida bir xil. Skanerlash iteratori yadrodir; Over iterator - bu uning ozgina o'zgarishi.

Bu erda ssr bilan ishlash.

Agar biz faqat yakuniy natijani xohlasak, Over iteratordan foydalanamiz.

Umuman olganda, v qiymati uchun v/[x] oxirgi v \ [x] bilan bir xil bo'ladi. Aks holda, Scan uchun to'g'ri bo'lgan narsa Over uchun to'g'ri. (Scan o'rniga Overdan foydalanish kdb+ ga oraliq natijalarni tashlab, xotirani biroz kamroq ishlatishga imkon beradi.)

Agar Over tugmachasini ishlatishdan hayron bo'lsangiz, uni Scan bilan almashtiring va oraliq natijalarni tekshiring. Odatda ular yoritadi.

Scan 1, 2, 3 darajali qiymatlardan kelib chiqadigan funktsiyalarni qo'llashni ko'rib chiqing.

Va hokazo, f8 \ gacha. Har bir shaklda, x - birinchi baholashning argumenti. Birinchi baholash natijasi, agar mavjud bo'lsa, keyingi baholash uchun (birinchi) dalil bo'ladi. Va hokazo.

Qancha baho uchun? Bu birinchi navbatda qiymat darajasiga bog'liq.

qiymat darajasi baholashlar soni
2-8 to'g'ri argument/s uzunligi
1 natijalarga va olingan funktsiyaning chap argumentiga (agar mavjud bo'lsa) bog'liq

Agar f 2 -darajali yoki undan yuqori bo'lsa, baholar soni to'g'ri argument/s uzunligiga qarab belgilanadi. Yuqoridagi ssr misolida to'g'ri argumentlar uzunligi 3 ga teng va ssr uch marta baholanadi.

F1 \ f1 tomonidan bajarilgan baholash sonini aniqlashning uchta usuli mavjud.

Ma'lumotnomadagi jadval bizga f1 \ o'zgaruvchanligini bildiradi va uni unary (Converge) yoki ikkilik (Do yoki while) sifatida ishlatish mumkin.

Birlashing

F1 \ unariar sifatida konverger deb nomlanadi, chunki f1 \ oldingi natijaga yoki asl argumentga mos kelguncha baholanadi.

E'tibor bering, hamma ketma -ketlik shu tarzda birlashmaydi. Siz kdb+ ni cheksiz tsiklga tashlash uchun akkumulyatorlardan foydalanishingiz mumkin.

Converge bilan ishlaganda, \ T buyrug'i orqali sessiyangizdagi tanaffusni o'rnatish oqilona bo'ladi. Bu har qanday funktsiyani belgilangan soniyalardan keyin to'xtatilishiga olib keladi. Cheksiz tsikl sizning sessiyangizni qulflamaydi.

.Zs bilan rekursiya

"O'z" funktsiyasi .zs, shuningdek, rekursiya uchun ishlatilishi mumkin va Scan -ga qaraganda ancha moslashuvchan.

Yuqoridagi funktsiya har qanday tuzilish va ma'lumotlar turlarining ro'yxatida ishlaydi, satrlar va belgilarni katta harflarga o'zgartiradi va boshqa barcha elementlarni o'zgarishsiz qoldiradi.

E'tibor bering, .zs dan foydalanganda, funktsiya 2000 tsikldan so'ng, xato haqida signal beradi.

Scan and Over -da bunday cheklov yo'q.

.Zs dan faqat yinelatorlardan foydalanish mumkin bo'lmaganda foydalaning.

Do va while

F1 \ ni ikkilik sifatida qo'llash bizga chiqish shartini chap argument sifatida o'rnatish imkonini beradi:

  • butun son: bu sonli baholashdan keyin chiqish (Do)
  • haqiqat funktsiyasi: buni har bir natijaga qo'llang va nolga baholanganda chiqing (While)

Belgilangan va tasvirlangan funktsiyani ko'rib chiqing.

Ko'rinib turibdiki, funktsiya 2 -davrali tsiklga olib keladi (hech bo'lmaganda suzuvchi nuqta bardoshligi ichida). Chiqish shartisiz (yuqorida, 30 ta baho) u tugamaydi.

Fibonachchi raqamlari butun sonli vektorni uning oxirgi ikkita elementi yig'indisiga qo'shib hisoblab chiqiladi.

Ro'yxatlar va lug'atlar

Takrorlovchilarning dalillari amaldagi qiymatlardir: funktsiyalar, fayllar va jarayonlar, ro'yxatlar va lug'atlar. Vazifalar iterator dalillari sifatida eng tanish, lekin ro'yxatlar va lug'atlar o'rganishni mukofotlaydi.

Lug'at yo'nalishi-bu cheklangan holatdagi mashina: uning qiymatlari ham haqiqiy kalitlardir.

Oxirgi ifodada ham qiymat, ham haqiqat qiymati lug'atlardir. Hech qanday funktsiyalar ishtirok etmaydi.

Iteratorlarni birlashtirish

Scan va Every Prior yordamida Paskal uchburchagini hisoblashimiz mumkin.

Uchburchakni skanerlashdan foydalanishning ketma -ket natijalari sifatida darhol ko'rish uchun bizda akkumulyatorlar etarli. Uchburchakning bir qatorini uning ustidagi qatorga qarab aniqlash uchun bizga faqat funksiya kerak. Bu osonroq bo'lishi qiyin. Har bir satr qo'shni juft elementlarni yig'ish orqali ota -onasidan olingan.

E'tibor bering, oxirgi ifoda bizga uchburchakning etti emas, sakkiz qatorini berdi . Natijaning birinchi bandi dastlabki dalil, so'ngra ketma -ket etti baholash natijalari edi.

Agar olingan funktsiyaning chap argumenti nol bo'lsa, hech qanday baho bo'lmaydi. Asl argument natijaning birinchi (va yagona) elementi sifatida qaytariladi. Hatto qiymat sohasida bo'lishi shart emas.

Do ni shu tarzda shartli sifatida ishlatishingiz mumkin.

Iteratorning argumenti funktsiya, ro'yxat yoki lug'atdir. Uning natijasi - bu funktsiya, shuning uchun ham iteratorning argumenti bo'lishi mumkin.

Barcha mumkin bo'lgan juftlarni ikkita ro'yxatdan yarating:

Bu erda/: (Har bir o'ngga qo'shilish) funktsiyasi iterator \: (Har bir chap) argumentidir. Natijada:/: \: (Har bir o'ngga, chapga qo'shilish) ikkilik funktsiyasi infix sintaksisiga ega - Postfix infix hosil bo'lishini unutmang . Yuqoridagi misolda u 3 × 3 juftlik matritsasini qaytaradi, bu erda juftliklar ro'yxatiga kiritilgan, chunki standart displey matritsa tuzilishini ochib bermaydi.

Natija tartibini o'zgartirish uchun iteratorlarni almashtiring.

Raz kalit so'zidan ko'p emas,/ (Qo'shilish). U chuqur biriktirilgan tuzilmalarni tekislash uchun ko'pincha birlashish bilan birlashtiriladi. Yaxshi q uslubi kalit so'zlarni afzal ko'radi, lekin, // yana bir bor ko'rsatadiki, olingan funktsiya boshqa iteratorga argument bo'lishi mumkin.

Har bir operatordan funktsiyani ichki ro'yxatda ma'lum bir chuqurlikda qo'llash uchun foydalanishingiz mumkin.

Yaxshi q uslubi qavs va qavs ichidan qochadi va mavjud bo'lgan joylarda kalit so'zlarni afzal ko'radi. Bu tamoyillar bir nechta yineluvchi tuzishda zid keladi.

Yineluvchilarni tuzishda, ixcham shakllarga ustunlik bering. Ularni tahlil qilish osonroq.

Iteratorlar looplarga qarshi

Boshqaruv so'zlari q va dasturchilarga aniq ko'chadan yozishga imkon beradi. Ba'zida bu takrorlashni yozishning yagona usuli. Biroq, iteratsiyaning eng keng tarqalgan shakllarini iteratorlar yordamida aniqlash mumkin, bu kodni qisqa, tezroq va xatolarga kamroq moyil qiladi.

Ko'pincha, har bir, har bir chap va har o'ngdan foydalanib, ro'yxatni aylanib o'tish va uning elementlarini o'zgartirish osonroq bo'ladi.

Aytaylik, biz ba'zi ro'yxatlarda 2 yoki 3 tamsayılardan biri mavjudligini tekshirishni xohladik. Bunga vaqt tsikli yordamida erishish mumkin.

Biroq, iteratorlar yanada aniq va samaraliroq kodni beradi; o'qish osonroq va saqlash arzonroq.

Xuddi shunday, biz C-ga o'xshash tillarda halqalar hal qiladigan vaziyatlarni osonlik bilan hal qilish uchun Over iteratordan foydalanishimiz mumkin.

Aytaylik, siz bir nechta jadvallarga qo'shilishni xohladingiz.

Iteratorlar yordamida hech qanday yechim topa olmaganingizda, looplarni yozing.

Ichki ustunlar

Eng yaxshi amaliyot, iloji boricha, ichki ustunlardan qochadi. Biroq, ba'zi hollarda, joylashtirilgan ma'lumotlarga asoslangan operatsiyalar talab qilinadi yoki ba'zi so'rovlarni bajarish vaqtini kamaytirishi mumkin. Buning eng keng tarqalgan holati shundaki, ichkariga kirgizilgan ustunlarni o'z ichiga olgan jadvalni tekislaydigan kalit so'zlar guruhi, ayniqsa, butun jadvalning kichik qismi bilan ishlayotganingizda, hisob -kitob uchun qimmat.

Ma'lumotlarni ichki tuzilishda saqlash mantiqiy bo'lgan holatlar ham mavjud. Masalan, sim faylining shishib ketishiga yo'l qo'ymaslik uchun siz simvollar o'rniga satrlardan foydalanishni xohlashingiz mumkin.

Shunday qilib, biz funktsiyalarni butun jadvalga qo'llash uchun funktsiyalarni va tanlangan bayonotda funktsiyalarni qo'llash uchun iteratorlardan foydalanishni ko'rib chiqamiz.

Iteratorlar yordamida jadvallarni tekshirish va o'zgartirish mumkin. Buning uchun jadvallar qanday tuzilganligini tushunishimiz kerak. Kdb+da jadval-bu to'liq bo'lmagan qiymatlarga ega bo'lishi mumkin bo'lgan lug'atlar ro'yxati. Bu shuni anglatadiki, biz boshqa har qanday ro'yxat yoki lug'at tuzilishi kabi funktsiyalarni individual qadriyatlarga qo'llashimiz mumkin. Misol uchun:

Biz bu erda [a] turi 98 soatni qaytaradi, shuning uchun a - jadval. Keyin '[a] yozing, har bir elementning turini qaytaradi - ular lug'atlar, 99h turi bilan. Keyin '' [a] yozuvi har bir lug'atning har bir qiymatining turini topadi. Natijada lug'atlar ro'yxati paydo bo'ladi, ular jadvalning har bir maydonining turini ko'rsatadigan jadvalga qaytadi.

Ushbu bayonot jadvalning barcha qatorlari bir xil bo'lishini ta'minlash uchun ishlatilishi mumkin. Agar sizning jadvalingizda ichki ustunlar bo'lsa, bu foydali bo'ladi, chunki meta kalit so'z faqat joylashtirilgan ustunlarning birinchi qatorida ko'rinadi. Va agar jadval kalitli bo'lsa, meta faqat kalit bo'lmagan ustunlarga qo'llaniladi.

Faqat meta natijalariga qarab, c ustunida faqat butun sonlar ro'yxati bor deb taxmin qilishimiz mumkin. Biroq "'[a] turining aniq turi c ustunida har xil turdagi ro'yxatlarni o'z ichiga oladi va shuning uchun ularni birlashtirish mumkin emas. Bu keng tarqalgan jadvalga xat yozishning keng tarqalgan sababidir. Tanlash/yangilash bayonnomasi orqali jadvalga joylashtirilgan ma'lumotlar bilan ishlash ko'pincha iteratorlardan foydalanishni talab qiladi. Buni tasvirlash uchun, ikkita ustun qo'yilgan uchta ustunli jadvalni aniqlaylik.

Aytaylik, biz har bir qatorning diapazonini xohladik.

Jadvalning har bir satriga funktsiyani qo'llash uchun biz tanlagan bayonotda rng bilan har biridan foydalanishimiz mumkin.

Aytaylik, biz jadvaldagi ma'lumotlar to'plamining diapazonini xohladik. Buning bir usuli - jadvalni guruhdan ajratish va diapazonni topish.

Biroq, ichki ro'yxatga kiritish tezroq bo'ladi, chunki bu qimmat guruhlarni ajratish funktsiyasini oldini oladi. Birinchidan, bizning vaqt oralig'imizdagi narxlar indeksini toping.

Keyin har bir narxlar ro'yxatiga indekslash uchun foydalaning va natijada olingan narxlarga rng qo'llang.

Bu guruhdan foydalanishda kechikish vaqtini sezilarli darajada yaxshilaydi.

Agar ichki ro'yxatlar bir xil bo'lmasa, kodni o'zgartiring:

Xulosa

Bu oq qog'ozda q iteratorlari umumlashtirilib, ular qanday qilib yangi funktsiyalarni qiymatlardan- funktsiyalar, fayllar va jarayonlar dastaklari, ro'yxatlar va lug'atlardan olishlari ko'rsatilgan.

U, misollar bilan, iteratorning ta'sirini ba'zan qo'llaniladigan qiymat darajasiga qarab, ba'zan esa olingan funktsiya qo'llaniladigan darajaga qarab belgilaydi. Xulq -atvorni tushunish uchun bir nechta yineluvchi tuzadigan murakkab misollarni ham tahlil qilish mumkin.

Takroriy funktsiyalarni yaratish va takrorlanuvchi funktsiyalarni tanlangan iboralar ichidagi funktsiyalarga qo'llash kabi yineluvchilarning ayrim qo'llanilishi batafsilroq ko'rib chiqildi, chunki ular ko'pincha yaxshi tushunilmagan, lekin ko'p hollarda foydali. Yineluvchilarning bajarilish vaqtini qisqartirish qobiliyatini ko'rsatish uchun ba'zi bir umumiy maqsadlar ko'rib chiqildi.

Bu oq varaqda ichki va foydalanuvchi tomonidan aniqlangan funktsiyalarni kengaytirish uchun iteratorlardan qanday osonlikcha foydalanish mumkinligi ko'rsatilgan, bu kod kdb+ning katta hajmli ma'lumotlarni tez qayta ishlash qobiliyatidan to'liq foydalanish imkonini beradi.

Yineluvchilarni to'g'ri ishlatish ma'lumotlar manipulyatsiyasini kamaytiradi va sodda kodni ishlab chiqaradi va uni saqlash osonroq bo'ladi.

Barcha testlar kdb+ 3.6 (2018.10.23) yordamida o'tkazildi.

Mualliflar

Conor Slattery- moliyaviy sinflar muhandisi, aktivlar sinflari uchun kdb+ dasturlarini ishlab chiqqan. Konor hozirda Nyu-Yorkda joylashgan, AQShning qimmatli qog'ozlar bozori uchun kdb+ savdo platformalarini ishlab chiquvchi investitsiya firmasi bilan hamkorlik qilmoqda.

Ushbu maqolaning oldingi versiyasi Slattery tomonidan 2013 yilda "Qo'shimchalarni samarali ishlatish" nomi bilan nashr etilgan.

Stiven TeylorFRSA - KX kutubxonachisi. U APL, J, k va q orqali Iverson tillari evolyutsiyasini kuzatgan va Britaniya APL assotsiatsiyasining " Vektor " jurnalining sobiq muharriri .