mdeck 3.7.0 → 3.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/README.md +4 -4
  3. package/assets/base.css +9 -5
  4. package/assets/extensions/themes/academic/styles.css +22 -22
  5. package/assets/extensions/themes/glass/styles.css +17 -17
  6. package/assets/extensions/themes/minimal/styles.css +14 -14
  7. package/assets/extensions/themes/neue/styles.css +14 -14
  8. package/assets/extensions/themes/plain/styles.css +17 -17
  9. package/assets/extensions/themes/work/styles.css +26 -26
  10. package/docs/reference/authoring.md +12 -0
  11. package/docs/site/content/drawing.md +6 -2
  12. package/docs/site/content/media.md +3 -1
  13. package/docs/site/content/presenting.md +47 -0
  14. package/examples/python/slides.de.md +493 -0
  15. package/examples/python/{slides.md → slides.en.md} +1 -1
  16. package/examples/python/slides.fa.md +492 -0
  17. package/examples/python/slides.hi.md +492 -0
  18. package/examples/showcase/slides.md +33 -0
  19. package/package.json +1 -1
  20. package/skills/write-slides/SKILL.md +1 -0
  21. package/src/build/config.js +1 -1
  22. package/src/build/slidesPlugin.js +34 -4
  23. package/src/components/VideoPlayer.jsx +70 -6
  24. package/src/components/callout.css +10 -10
  25. package/src/components/citation.css +2 -2
  26. package/src/components/code-block.css +3 -3
  27. package/src/components/poll.css +6 -6
  28. package/src/components/video-player.css +15 -0
  29. package/src/core/editDeck.js +3 -2
  30. package/src/core/icons.js +1 -0
  31. package/src/core/labels.js +2 -0
  32. package/src/core/languages.js +51 -0
  33. package/src/core/parseSlides.js +15 -3
  34. package/src/core/validateDeck.js +5 -0
  35. package/src/editor/components/DeckSettings.jsx +4 -0
  36. package/src/editor/components/MetaFields.jsx +7 -0
  37. package/src/layouts/layoutApi.jsx +7 -1
  38. package/src/live/answer/answer.css +2 -2
  39. package/src/runtime/chrome.jsx +6 -7
  40. package/src/runtime/deck-stage.js +249 -11
  41. package/src/runtime/hotspots.js +98 -0
  42. package/src/runtime/ink/bus.js +21 -1
  43. package/src/runtime/ink/room.js +20 -8
  44. package/src/runtime/main.jsx +179 -23
  45. package/src/runtime/zoom/camera.js +77 -0
  46. /package/examples/python/{slides.drawings.json → slides.en.drawings.json} +0 -0
@@ -0,0 +1,492 @@
1
+ ---
2
+ theme: academic
3
+ meta:
4
+ title: "آشنایی با Python"
5
+ author: "Tilman Schieber"
6
+ organization: "FHNW"
7
+ date: "2026-05-19"
8
+ palette: paper
9
+ ---
10
+
11
+ ---
12
+ :::meta
13
+ layout: title
14
+ id: python-for-life-sciences
15
+ :::
16
+ # Python برای علوم زیستی.
17
+ ## آشنایی گام‌به‌گام برای دانشجویان کارشناسی ارشد.
18
+
19
+ :::notes
20
+ به درس Python خوش آمدید. این جلسه هیچ تجربهٔ قبلی در برنامه‌نویسی را فرض نمی‌کند.
21
+
22
+ - گام‌به‌گام پیش می‌رویم؛ هر وقت سؤالی داشتید، بی‌درنگ بپرسید
23
+ - همهٔ کدها مستقیم در مرورگر اجرا می‌شوند؛ امروز نیازی به نصب چیزی نیست
24
+ - هدف: در پایان می‌توانید یک مجموعه‌داده را بارگذاری کنید، بررسی کنید و نمودارش را بکشید
25
+ :::
26
+
27
+ ---
28
+ :::meta
29
+ layout: focus
30
+ eyebrow: چرا Python؟
31
+ id: the-tools-your-field-uses-are-written-in
32
+ :::
33
+ # ابزارهای رشتهٔ شما *با Python نوشته شده‌اند*.
34
+
35
+ :::notes
36
+ Python در دانشگاه و صنعت، زبان غالب برای کارهای داده‌محور است.
37
+ علوم زیستی هم استثنا نیست: بیوانفورماتیک، تصویربرداری و تحلیل داده‌های بالینی همه روی Python اجرا می‌شوند.
38
+
39
+ اکوسیستم آن (NumPy، Pandas، Matplotlib، scikit-learn، BioPython) بی‌رقیب است.
40
+ اشاره کنید که R هنوز در آمار رایج است، اما Python تا حد زیادی به زبان مشترک تبدیل شده است.
41
+ :::
42
+
43
+ ---
44
+ :::meta
45
+ layout: chapter
46
+ number: 1
47
+ part: شروع کار
48
+ description: متغیرها، نوع‌ها و نخستین خطوط کد شما.
49
+ id: variables-and-data-types
50
+ :::
51
+ # متغیرها و نوع‌های داده.
52
+
53
+ :::notes
54
+ حتی اگر دانشجویان قبلاً کمی Python دیده‌اند، از همین‌جا شروع کنید. از پایه می‌سازیم.
55
+ زمان تقریبی این فصل: ۲۰ دقیقه.
56
+ :::
57
+
58
+ ---
59
+ :::meta
60
+ layout: split
61
+ section: متغیرها
62
+ id: variables-store-data
63
+ props:
64
+ ratio: [3, 2]
65
+ :::
66
+ # متغیر نامی برای یک مقدار است.
67
+ :::slot left
68
+ ```python live editable copy
69
+ name = "E. coli"
70
+ genome_size = 4_641_652 # جفت باز
71
+ gc_content = 0.506 # کسر
72
+
73
+ print(name, genome_size, gc_content)
74
+ print(f"GC content: {gc_content:.1%}")
75
+ ```
76
+ :::
77
+ :::slot right
78
+ بدون اعلان: Python نوع را از خود مقدار تشخیص می‌دهد.
79
+
80
+ **امتحان کنید:** `gc_content` را به `0.65` تغییر دهید و دوباره اجرا کنید.
81
+ :::
82
+
83
+ :::notes
84
+ متغیر فقط نامی است که به یک مقدار وصل شده. Python نوع را خودکار تشخیص می‌دهد.
85
+
86
+ یادآوری کنید: نه نقطه‌ویرگول، نه اعلان نوع، نه کد اضافی. رشتهٔ `f"…"` مقداری را درون متن قالب‌بندی می‌کند؛ `:.1%` کسر را به‌صورت درصد نشان می‌دهد.
87
+ دانشجویان را تشویق کنید مقادیر را تغییر دهند و دوباره اجرا کنند؛ هدف بلوک زنده همین است.
88
+ :::
89
+
90
+ ---
91
+ :::meta
92
+ section: نوع‌های داده
93
+ id: four-types-cover-most-biology-data
94
+ :::
95
+ # چهار نوع، بیشتر داده‌های زیستی را پوشش می‌دهند.
96
+
97
+ :::steps
98
+ - **`int`** — اعداد صحیح: شمارش‌ها، موقعیت‌ها، اندیس‌ها
99
+ - **`float`** — اعداد اعشاری: غلظت‌ها، p-value، تغییرات چندبرابری
100
+ - **`str`** — متن: نام ژن‌ها، توالی‌ها، شناسهٔ نمونه‌ها
101
+ - **`bool`** — True یا False: پرچم معناداری، فیلترهای کیفیت
102
+ :::
103
+
104
+ :::notes
105
+ هر بار یک نوع را نشان دهید و پیش از نمایش بعدی، از تجربهٔ آزمایشگاهی دانشجویان مثالی بخواهید.
106
+
107
+ تأکید کنید که مقادیر بولی معمولاً از مقایسه به دست می‌آیند، نه از نوشتن مستقیم True/False. اسلاید بعدی از همهٔ کلاس می‌پرسد.
108
+ :::
109
+
110
+ ---
111
+ :::meta
112
+ section: نوع‌های داده
113
+ title: "نظرسنجی: نوع p-value"
114
+ id: poll-the-type-of-a-p-value
115
+ :::
116
+ # p-value از چه نوعی است؟
117
+
118
+ <poll room="p-value" options="int|float|str|bool" answer="float" />
119
+
120
+ :::notes
121
+ یک بررسی کوتاه پیش از ادامه. گوشی‌ها با کد QR وصل می‌شوند؛ ارائه را با `mdeck run slides.fa.md --network` شروع کنید تا به این رایانه دسترسی داشته باشند.
122
+
123
+ پاسخ: `float`؛ دکمهٔ تیک زیر نمودار آن را علامت می‌زند. اگر بسیاری `bool` را انتخاب کردند، به *پرچم معناداری* فکر می‌کنند که از آن محاسبه می‌شود (`p < 0.05`): فرصت خوبی است تا نشان دهید مقایسه‌ها مقدار بولی می‌سازند.
124
+ :::
125
+
126
+ ---
127
+ :::meta
128
+ layout: split
129
+ section: رشته‌ها
130
+ props:
131
+ ratio: [3, 2]
132
+ :::
133
+ # رشته‌ها مثل توالی رفتار می‌کنند.
134
+ :::slot left
135
+ ```python live editable copy
136
+ dna = "ATGCGTAAGCTTGAC"
137
+
138
+ print("Length: ", len(dna))
139
+ print("First codon:", dna[:3])
140
+ print("A count: ", dna.count("A"))
141
+ print("Reversed: ", dna[::-1])
142
+ print("As RNA: ", dna.replace("T", "U"))
143
+ ```
144
+ :::
145
+ :::slot right
146
+ برش، شمارش و جایگزینی روی هر متنی یکسان کار می‌کنند.
147
+
148
+ **امتحان کنید:** آخرین کدون را با `dna[-3:]` چاپ کنید.
149
+ :::
150
+
151
+ :::notes
152
+ رشته‌ها توالی‌اند؛ می‌توانید آن‌ها را درست مثل یک توالی نوکلئوتیدی برش بزنید.
153
+ `replace("T", "U")` رونویسی در یک خط است. این مفاهیم بعداً مستقیم به BioPython منتقل می‌شوند.
154
+ :::
155
+
156
+ ---
157
+ :::meta
158
+ layout: chapter
159
+ number: 2
160
+ part: مجموعه‌ها
161
+ description: نگه‌داشتن چند مقدار با هم و دسترسی به آن‌ها.
162
+ :::
163
+ # لیست‌ها و دیکشنری‌ها.
164
+
165
+ :::notes
166
+ بیشتر داده‌های واقعی یک مقدار تنها نیستند. لیست‌ها و دیکشنری‌ها دو مجموعهٔ پرکاربرد اصلی‌اند.
167
+ زمان تقریبی این فصل: ۲۵ دقیقه.
168
+ :::
169
+
170
+ ---
171
+ :::meta
172
+ layout: split
173
+ section: لیست‌ها
174
+ props:
175
+ ratio: [3, 2]
176
+ :::
177
+ # لیست مقادیر را به ترتیب نگه می‌دارد.
178
+ :::slot left
179
+ ```python live editable copy
180
+ conc = [0.12, 0.45, 0.33, 0.78, 0.21]
181
+
182
+ print("Samples:", len(conc))
183
+ print("First: ", conc[0])
184
+ print("Last: ", conc[-1])
185
+ print("Sorted: ", sorted(conc))
186
+ print("Mean: ", sum(conc) / len(conc))
187
+ ```
188
+ :::
189
+ :::slot right
190
+ شمارش از صفر شروع می‌شود: `conc[0]` اولین عضو است و `conc[-1]` آخرین.
191
+
192
+ **امتحان کنید:** مقدار ششمی اضافه کنید و تغییر میانگین را ببینید.
193
+ :::
194
+
195
+ :::notes
196
+ لیست‌ها ترتیب را حفظ می‌کنند و مقدار تکراری را می‌پذیرند. اندیس از ۰ شروع می‌شود. اندیس‌های منفی از انتها می‌شمارند.
197
+ مناسب برای: سری‌های زمانی، اندازه‌گیری‌های تکراری، مراحل پردازش به ترتیب.
198
+
199
+ اشتباه رایج: دانشجویان برای اولین عضو اندیس ۱ را امتحان می‌کنند. اندیس‌گذاری از ۰ را زود جا بیندازید.
200
+ :::
201
+
202
+ ---
203
+ :::meta
204
+ layout: split
205
+ section: دیکشنری‌ها
206
+ props:
207
+ ratio: [3, 2]
208
+ :::
209
+ # دیکشنری مقادیر را با نامشان پیدا می‌کند.
210
+ :::slot left
211
+ ```python live editable copy
212
+ sample = {
213
+ "id": "S042",
214
+ "organism": "Mus musculus",
215
+ "tissue": "liver",
216
+ "weight_mg": 312,
217
+ }
218
+
219
+ print(sample["organism"])
220
+ sample["weight_mg"] = 318 # به‌روزرسانی یک فیلد
221
+ print(sample)
222
+ ```
223
+ :::
224
+ :::slot right
225
+ هر دیکشنری یک نمونه را توصیف می‌کند: لازم نیست شمارهٔ ستون‌ها را به خاطر بسپارید.
226
+
227
+ **امتحان کنید:** `"treated": True` را اضافه کنید.
228
+ :::
229
+
230
+ :::notes
231
+ دیکشنری‌ها کلیدها را به مقادیر نگاشت می‌کنند. برای رکوردهای ساختاریافته عالی‌اند: یک دیکشنری = یک نمونه.
232
+ بعدها یک لیست از دیکشنری‌ها به یک DataFrame در Pandas تبدیل می‌شود. این بذر را همین حالا بکارید.
233
+ :::
234
+
235
+ ---
236
+ :::meta
237
+ layout: chapter
238
+ number: 3
239
+ part: کنترل جریان
240
+ description: تصمیم‌گیری و تکرار عملیات روی داده‌ها.
241
+ :::
242
+ # تصمیم‌ها و حلقه‌ها.
243
+
244
+ :::notes
245
+ این دو ساختار، if و for، بخش عمدهٔ منطق اسکریپت‌های پردازش داده را پوشش می‌دهند.
246
+ زمان تقریبی این فصل: ۲۵ دقیقه.
247
+ :::
248
+
249
+ ---
250
+ :::meta
251
+ layout: split
252
+ section: شرط‌ها
253
+ props:
254
+ ratio: [3, 2]
255
+ :::
256
+ # `if` یک مسیر را انتخاب می‌کند.
257
+ :::slot left
258
+ ```python live editable copy
259
+ p_value = 0.023
260
+ fold_change = 2.4
261
+
262
+ if p_value < 0.05 and fold_change > 2:
263
+ print("Significant upregulation")
264
+ elif p_value < 0.05:
265
+ print("Significant, modest effect")
266
+ else:
267
+ print("Not significant")
268
+ ```
269
+ :::
270
+ :::slot right
271
+ تورفتگی همان بلوک است: Python از فاصله استفاده می‌کند، نه از آکولاد.
272
+
273
+ **امتحان کنید:** `fold_change = 1.5` را قرار دهید.
274
+ :::
275
+
276
+ :::notes
277
+ if / elif / else همهٔ شاخه‌ها را پوشش می‌دهد. در Python تورفتگی سلیقه‌ای نیست؛ بخشی از نحو است.
278
+ دانشجویانی که از زبان‌های دیگر یا R می‌آیند اینجا گیر می‌کنند. دونقطه و تورفتگی اجباری‌اند.
279
+ نشان دهید اگر دونقطه را فراموش کنید چه می‌شود: Python خطای SyntaxError می‌دهد.
280
+ :::
281
+
282
+ ---
283
+ :::meta
284
+ layout: split
285
+ section: حلقه‌ها
286
+ props:
287
+ ratio: [3, 2]
288
+ :::
289
+ # `for` یک کار را برای هر عضو تکرار می‌کند.
290
+ :::slot left
291
+ ```python live editable copy
292
+ values = [1.2, 0.8, 2.1, 1.5, 0.9, 2.8]
293
+
294
+ above = []
295
+ for value in values:
296
+ if value > 1.0:
297
+ above.append(value)
298
+
299
+ print(len(above), "of", len(values))
300
+ print(above)
301
+ ```
302
+ :::
303
+ :::slot right
304
+ حلقه، آزمون، جمع‌آوری: الگوی اصلی فیلتر کردن داده‌ها.
305
+
306
+ **امتحان کنید:** به جای آن، مقادیر کمتر از 1.0 را بشمارید.
307
+ :::
308
+
309
+ :::notes
310
+ حلقه‌های for روی هر مجموعه‌ای پیمایش می‌کنند. این الگو، یعنی حلقه، آزمون، جمع‌آوری، در قلب تقریباً هر اسکریپت پردازش داده‌ای است که دانشجویان خواهند نوشت.
311
+
312
+ کلید **D** را بزنید و یک مقدار را روی اسلاید در حلقه دنبال کنید: به `value`، از میان `if`، به `above`. Escape طراحی را متوقف می‌کند؛ نقاشی با اسلاید می‌ماند.
313
+ :::
314
+
315
+ ---
316
+ :::meta
317
+ layout: chapter
318
+ number: 4
319
+ part: تابع‌ها
320
+ description: بسته‌بندی منطق برای استفادهٔ دوباره و آزمودن.
321
+ :::
322
+ # تابع‌ها منطق را برای استفادهٔ دوباره بسته‌بندی می‌کنند.
323
+
324
+ :::notes
325
+ تابع‌ها نخستین گام به سوی کدی قابل استفادهٔ دوباره و قابل آزمون‌اند.
326
+ انگیزه دهید: «همین محاسبه را روی ۲۰۰ نمونه اجرا خواهید کرد؛ یک بار بنویسید، ۲۰۰ بار فراخوانی کنید.»
327
+ زمان تقریبی این فصل: ۲۰ دقیقه.
328
+ :::
329
+
330
+ ---
331
+ :::meta
332
+ layout: split
333
+ section: تابع‌ها
334
+ props:
335
+ ratio: [3, 2]
336
+ :::
337
+ # تابع ورودی‌ها را به خروجی تبدیل می‌کند.
338
+ :::slot left
339
+ ```python live editable copy
340
+ def gc_content(seq):
341
+ """کسر GC یک توالی را برمی‌گرداند."""
342
+ gc = seq.count("G") + seq.count("C")
343
+ return gc / len(seq)
344
+
345
+ for seq in ["ATGCGC", "AATTAA", "GCGCGC"]:
346
+ print(seq, f"{gc_content(seq):.0%}")
347
+ ```
348
+ :::
349
+ :::slot right
350
+ یک بار بنویسید، سپس آن را روی هر نمونه فراخوانی کنید.
351
+
352
+ **امتحان کنید:** توالی خودتان را به لیست اضافه کنید.
353
+ :::
354
+
355
+ :::notes
356
+ def، پارامترها، return: کل نحو همین است.
357
+ مرحله‌به‌مرحله توضیح دهید: یک بار تعریف کنید، بارها با ورودی‌های مختلف فراخوانی کنید.
358
+ docstring (رشتهٔ سه‌گیومه‌ای پس از def) روش درستی است؛ زود معرفی‌اش کنید.
359
+ :::
360
+
361
+ ---
362
+ :::meta
363
+ layout: chapter
364
+ number: 5
365
+ part: Python علمی
366
+ description: NumPy، Pandas و Matplotlib، سه ستون اصلی.
367
+ :::
368
+ # پشتهٔ علمی.
369
+
370
+ :::notes
371
+ همین سه کتابخانه‌اند که Python را به زبان غالب علم داده تبدیل کرده‌اند.
372
+ دانشجویان در عمل Python خالص زیادی نمی‌نویسند؛ از این‌ها استفاده می‌کنند.
373
+ زمان تقریبی این فصل: ۳۰ دقیقه.
374
+ :::
375
+
376
+ ---
377
+ :::meta
378
+ section: Python علمی
379
+ :::
380
+ # سه کتابخانه بیشتر کارهای علوم زیستی را پوشش می‌دهند.
381
+
382
+ :::steps
383
+ - **NumPy** — آرایه‌های سریع: محاسبه روی کل مجموعه‌داده به‌یک‌باره
384
+ - **Pandas** — جدول‌ها: بارگذاری، فیلتر، گروه‌بندی و خلاصه‌سازی داده‌های صفحه‌گسترده
385
+ - **Matplotlib** — نمودارها، با کنترل روی تک‌تک اجزا
386
+ :::
387
+
388
+ :::notes
389
+ مروری کوتاه پیش از ورود به جزئیات. پیام اصلی: این کتابخانه‌ها کارهای سنگین را انجام می‌دهند،
390
+ پس دانشجویان کد کمتری می‌نویسند و نتایجی سریع‌تر و مطمئن‌تر از حلقه‌های Python خالص می‌گیرند.
391
+ :::
392
+
393
+ ---
394
+ :::meta
395
+ layout: split
396
+ section: NumPy
397
+ props:
398
+ ratio: [3, 2]
399
+ :::
400
+ # NumPy روی کل آرایه محاسبه می‌کند.
401
+ :::slot left
402
+ ```python live copy
403
+ import numpy as np
404
+
405
+ m = np.array([1.2, 0.8, 2.1, 1.5, 0.9, 2.8])
406
+
407
+ print("Mean: ", m.mean().round(3))
408
+ print("Std: ", m.std().round(3))
409
+ print("Median:", np.median(m))
410
+ print("> 1.5: ", m[m > 1.5])
411
+ ```
412
+ :::
413
+ :::slot right
414
+ `m[m > 1.5]` بدون حلقه فیلتر می‌کند.
415
+
416
+ آن را با حلقهٔ `for` دو فصل قبل مقایسه کنید.
417
+ :::
418
+
419
+ :::notes
420
+ عملیات NumPy به‌یک‌باره روی کل آرایه اعمال می‌شوند؛ بدون حلقه. هم سریع‌تر است و هم خواناتر.
421
+ عادت به این سبک برداری زمان می‌برد، اما ارزش دارد زود یاد گرفته شود.
422
+ نمایش: پیش از اجرا از دانشجویان بخواهید حدس بزنند `m > 1.5` چه برمی‌گرداند.
423
+ :::
424
+
425
+ ---
426
+ :::meta
427
+ layout: focus
428
+ eyebrow: نکتهٔ کلیدی
429
+ :::
430
+ # عملیات را روی *آرایه‌ها* بنویسید، نه روی تک‌مقدارها.
431
+
432
+ :::notes
433
+ این مهم‌ترین تغییر ذهنی از Python خالص به Python علمی است.
434
+ تکرارش کنید، بگذارید جا بیفتد. دانشجویانی که زود آن را درونی کنند، بعدها کد بسیار تمیزتری می‌نویسند.
435
+ :::
436
+
437
+ ---
438
+ :::meta
439
+ layout: chapter
440
+ number: 6
441
+ part: گام‌های بعدی
442
+ description: از اینجا به کجا برویم.
443
+ id: keep-going
444
+ :::
445
+ # ادامه دهید.
446
+
447
+ :::notes
448
+ با یک نقشهٔ راه جمع‌بندی کنید. دانشجویان پس از یک درس مقدماتی اغلب احساس سردرگمی می‌کنند؛ گام‌های بعدی مشخص به آن‌ها بدهید
449
+ و بهترین منابع رایگان را معرفی کنید.
450
+ :::
451
+
452
+ ---
453
+ :::meta
454
+ section: گام‌های بعدی
455
+ :::
456
+ # بعد از این چه یاد بگیریم.
457
+
458
+ - **Pandas** — بارگذاری CSV، فیلتر کردن سطرها، محاسبهٔ آمار گروه‌ها
459
+ - **Matplotlib و Seaborn** — نمودار پراکندگی، نقشهٔ حرارتی، نمودار آتشفشانی
460
+ - **scikit-learn** — طبقه‌بندی، خوشه‌بندی، کاهش ابعاد
461
+ - **BioPython** — توالی‌ها، BLAST، فایل‌های GenBank و PDB
462
+
463
+ :::notes
464
+ برای خودآموزی: آموزش رسمی Python برای نحو، و مستندات Pandas برای کار با داده.
465
+ دوره‌های رایگان Python و Pandas در Kaggle عالی‌اند و با سرعت دلخواه پیش می‌روند.
466
+ به‌طور خاص برای علوم زیستی: مستندات BioPython و کتاب درسی Python for Bioinformatics (Bassi).
467
+ :::
468
+
469
+ ---
470
+ :::meta
471
+ layout: focus
472
+ eyebrow: به خاطر بسپارید
473
+ :::
474
+ # بهترین راه یادگیری برنامه‌نویسی، *نوشتن کد* است.
475
+
476
+ :::notes
477
+ با همین جمع‌بندی کنید. برنامه‌نویسی یک مهارت است و تمرین می‌خواهد. چند هفتهٔ اول کند به نظر می‌رسد،
478
+ بعد همه‌چیز جا می‌افتد. به تمرین روزانه تشویق کنید، حتی با اسکریپت‌های کوچک. به تمرین‌ها اشاره کنید.
479
+ :::
480
+
481
+ ---
482
+ :::meta
483
+ layout: title
484
+ :::
485
+ # سؤالی هست؟
486
+ ## سپاس‌گزارم؛ حالا لپ‌تاپ‌هایتان را باز کنید.
487
+
488
+ :::notes
489
+ برای پرسش‌ها وقت بگذارید.
490
+ به دانشجویان یادآوری کنید مطالب درس را کجا پیدا کنند و چطور با شما تماس بگیرند.
491
+ جلسهٔ بعد به Pandas و بارگذاری مجموعه‌داده‌های واقعی می‌پردازد.
492
+ :::