204 | `;
205 | });
206 | el.innerHTML = newInnerHtml;
207 | }
208 | }
209 | if (el.children && el.children.length > 0) {
210 | for (let i = 0; i < el.children.length; i++)
211 | breaksToDivs(el.children[i]);
212 | }
213 | }
214 | function detectCanvasElement(el, ctx, setPreviewDirection) {
215 | const container = ctx.containerEl;
216 | if (container && container.closest) {
217 | const possibleCanvas = container.closest(".canvas-node-content");
218 | if (possibleCanvas) {
219 | const markdownPreview = container.closest(".markdown-preview-view");
220 | if (markdownPreview && markdownPreview instanceof HTMLDivElement) {
221 | setPreviewDirection(ctx.sourcePath, markdownPreview);
222 | }
223 | }
224 | }
225 | }
226 | var autoDirectionPostProcessor = (el, ctx, setPreviewDirection) => {
227 | let shouldAddDir = false, addedDir = false;
228 | const childNodes = [];
229 | detectCanvasElement(el, ctx, setPreviewDirection);
230 | breaksToDivs(el);
231 | for (let i = 0; i < el.childNodes.length; i++) {
232 | const n = el.childNodes[i];
233 | if (!addedDir && n.nodeName === "#text" && n.nodeValue && n.nodeValue !== "\n") {
234 | const dir = detectDirection(n.nodeValue);
235 | if (dir) {
236 | addedDir = true;
237 | lastDetectedDir = dir;
238 | if (specialNodes.contains(el.nodeName) && el.parentElement) {
239 | addDirClassIfNotAddedBefore(el.parentElement, dirClass(dir));
240 | } else {
241 | el.addClass(dirClass(dir));
242 | if (el.parentElement && el.parentElement.nodeName === "LI") {
243 | addDirClassIfNotAddedBefore(el.parentElement, dirClass(dir));
244 | }
245 | }
246 | }
247 | shouldAddDir = true;
248 | continue;
249 | }
250 | childNodes.push(n);
251 | if (i === el.childNodes.length - 1 && shouldAddDir && !addedDir) {
252 | el.addClass(dirClass(lastDetectedDir));
253 | }
254 | }
255 | for (let i = 0; i < childNodes.length; i++) {
256 | autoDirectionPostProcessor(childNodes[i], ctx, setPreviewDirection);
257 | }
258 | if (el.nodeName === "UL") {
259 | const lis = el.querySelectorAll("li");
260 | if (lis.length > 0 && lis[0].hasClass("esm-rtl")) {
261 | el.addClass(dirClass("rtl"));
262 | }
263 | }
264 | };
265 | function dirClass(dir) {
266 | if (dir === "rtl") {
267 | return "esm-rtl";
268 | } else {
269 | return "esm-ltr";
270 | }
271 | }
272 | function addDirClassIfNotAddedBefore(el, cls) {
273 | if (el.hasClass("esm-rtl") || el.hasClass("esm-ltr")) {
274 | return;
275 | }
276 | el.addClass(cls);
277 | }
278 |
279 | // main.ts
280 | var import_view2 = require("@codemirror/view");
281 |
282 | // settingsTab.ts
283 | var import_obsidian2 = require("obsidian");
284 | var DEFAULT_SETTINGS = {
285 | fileDirections: {},
286 | defaultDirection: "ltr",
287 | rememberPerFile: true,
288 | setNoteTitleDirection: true,
289 | setYamlDirection: false,
290 | statusBar: true
291 | };
292 | var RtlSettingsTab = class extends import_obsidian2.PluginSettingTab {
293 | constructor(app, plugin) {
294 | super(app, plugin);
295 | this.plugin = plugin;
296 | this.settings = plugin.settings;
297 | }
298 | display() {
299 | let { containerEl } = this;
300 | containerEl.empty();
301 | containerEl.createEl("h2", { text: "RTL Settings" });
302 | this.plugin.syncDefaultDirection();
303 | new import_obsidian2.Setting(containerEl).setName("Remember text direction per file").setDesc("Store and remember the text direction used for each file individually.").addToggle((toggle) => toggle.setValue(this.settings.rememberPerFile).onChange((value) => {
304 | this.settings.rememberPerFile = value;
305 | this.plugin.saveSettings();
306 | this.plugin.adjustDirectionToActiveView();
307 | }));
308 | new import_obsidian2.Setting(containerEl).setName("Default text direction").setDesc("What should be the default text direction in Obsidian?").addDropdown((dropdown) => dropdown.addOption("ltr", "LTR").addOption("rtl", "RTL").addOption("auto", "Auto").setValue(this.settings.defaultDirection).onChange((value) => {
309 | this.settings.defaultDirection = value;
310 | this.app.vault.setConfig("rightToLeft", value == "rtl");
311 | this.plugin.saveSettings();
312 | this.plugin.adjustDirectionToActiveView();
313 | }));
314 | new import_obsidian2.Setting(containerEl).setName("Set note title direction").setDesc("In RTL notes, also set the direction of the note title.").addToggle((toggle) => toggle.setValue(this.settings.setNoteTitleDirection).onChange((value) => {
315 | this.settings.setNoteTitleDirection = value;
316 | this.plugin.saveSettings();
317 | this.plugin.adjustDirectionToActiveView();
318 | }));
319 | new import_obsidian2.Setting(containerEl).setName("Set YAML direction in Preview").setDesc("For RTL notes, preview YAML blocks as RTL. (When turning off, restart of Obsidian is required.)").addToggle((toggle) => {
320 | var _a;
321 | return toggle.setValue((_a = this.settings.setYamlDirection) != null ? _a : false).onChange((value) => {
322 | this.settings.setYamlDirection = value;
323 | this.plugin.saveSettings();
324 | this.plugin.adjustDirectionToActiveView();
325 | });
326 | });
327 | new import_obsidian2.Setting(containerEl).setName("Show status bar item").setDesc("Show a clickable status bar item showing the current direction.").addToggle((toggle) => {
328 | var _a;
329 | return toggle.setValue((_a = this.settings.statusBar) != null ? _a : true).onChange((value) => {
330 | this.settings.statusBar = value;
331 | this.plugin.saveSettings();
332 | this.plugin.adjustDirectionToActiveView();
333 | });
334 | });
335 | }
336 | };
337 |
338 | // main.ts
339 | var RtlPlugin = class extends import_obsidian3.Plugin {
340 | constructor() {
341 | super(...arguments);
342 | this.settings = null;
343 | this.statusBarItem = null;
344 | this.statusBarText = null;
345 | }
346 | async onload() {
347 | this.addCommand({
348 | id: "switch-text-direction",
349 | name: "Switch Text Direction (LTR->RTL->auto)",
350 | icon: "arrow-left-right",
351 | callback: () => {
352 | const view = this.app.workspace.getActiveViewOfType(import_obsidian3.MarkdownView);
353 | if (!view || !(view == null ? void 0 : view.editor))
354 | return;
355 | this.switchDocumentDirection(view.editor, view);
356 | }
357 | });
358 | this.autoDirectionPlugin = getAutoDirectionPlugin(this);
359 | this.registerEditorExtension(this.autoDirectionPlugin);
360 | this.registerEditorExtension(import_view2.EditorView.perLineTextDirection.of(true));
361 | this.registerMarkdownPostProcessor((el, ctx) => {
362 | autoDirectionPostProcessor(el, ctx, (path, markdownPreviewElement) => this.setCanvasPreviewDirection(path, markdownPreviewElement));
363 | });
364 | await this.convertLegacySettings();
365 | await this.loadSettings();
366 | this.addSettingTab(new RtlSettingsTab(this.app, this));
367 | this.app.workspace.on("active-leaf-change", async (leaf) => {
368 | this.adjustDirectionToActiveView();
369 | this.updateStatusBar();
370 | });
371 | this.app.workspace.on("file-open", async (file, ctx) => {
372 | this.adjustDirectionToActiveView();
373 | this.updateStatusBar();
374 | });
375 | this.registerEvent(this.app.vault.on("delete", (file) => {
376 | if (file && file.path && file.path in this.settings.fileDirections) {
377 | delete this.settings.fileDirections[file.path];
378 | this.saveSettings();
379 | }
380 | }));
381 | this.registerEvent(this.app.vault.on("rename", (file, oldPath) => {
382 | if (file && file.path && oldPath in this.settings.fileDirections) {
383 | this.settings.fileDirections[file.path] = this.settings.fileDirections[oldPath];
384 | delete this.settings.fileDirections[oldPath];
385 | this.saveSettings();
386 | }
387 | }));
388 | this.statusBarItem = this.addStatusBarItem();
389 | const languageIcon = (0, import_obsidian3.getIcon)("arrow-left-right");
390 | this.statusBarItem.appendChild(languageIcon);
391 | this.statusBarText = this.statusBarItem.createEl("span");
392 | this.statusBarText.style.marginLeft = "5px";
393 | this.statusBarItem.title = "Text direction";
394 | this.statusBarItem.addClass("mod-clickable");
395 | this.statusBarItem.addEventListener("click", (_ev) => {
396 | const view = this.app.workspace.getActiveViewOfType(import_obsidian3.MarkdownView);
397 | if (!view || !(view == null ? void 0 : view.editor))
398 | return;
399 | this.switchDocumentDirection(view.editor, view);
400 | });
401 | }
402 | onunload() {
403 | const view = this.app.workspace.getActiveViewOfType(import_obsidian3.MarkdownView);
404 | if (view && (view == null ? void 0 : view.editor)) {
405 | const editorView = view.editor.cm;
406 | this.adjustAutoDirection(editorView, "ltr");
407 | }
408 | console.log("unloading RTL plugin");
409 | }
410 | adjustDirectionToActiveView() {
411 | const view = this.app.workspace.getActiveViewOfType(import_obsidian3.MarkdownView);
412 | if (!view)
413 | return;
414 | this.adjustDirectionToView(view);
415 | }
416 | adjustDirectionToView(view, autoDirectionPlugin) {
417 | if (!view)
418 | return;
419 | this.syncDefaultDirection();
420 | const file = view == null ? void 0 : view.file;
421 | const editor = view == null ? void 0 : view.editor;
422 | const editorView = editor == null ? void 0 : editor.cm;
423 | if (file && file.path && editorView) {
424 | const [requiredDirection, _usedDefault] = this.getRequiredFileDirection(file);
425 | this.setMarkdownViewDirection(view, editor, editorView, requiredDirection, autoDirectionPlugin);
426 | }
427 | }
428 | getRequiredFileDirection(file) {
429 | if (!file) {
430 | return [this.settings.defaultDirection, true];
431 | }
432 | if (!(file instanceof import_obsidian3.TFile))
433 | return null;
434 | let requiredDirection = null;
435 | const frontMatterDirection = this.getFrontMatterDirection(file);
436 | let usedDefault = false;
437 | if (frontMatterDirection) {
438 | if (frontMatterDirection == "rtl" || frontMatterDirection == "ltr" || frontMatterDirection == "auto")
439 | requiredDirection = frontMatterDirection;
440 | else
441 | console.log("Front matter direction in file", file.path, "is unknown:", frontMatterDirection);
442 | } else if (this.settings.rememberPerFile && file.path in this.settings.fileDirections) {
443 | requiredDirection = this.settings.fileDirections[file.path];
444 | } else {
445 | requiredDirection = this.settings.defaultDirection;
446 | usedDefault = true;
447 | }
448 | return [requiredDirection, usedDefault];
449 | }
450 | async saveSettings() {
451 | await this.saveData(this.settings);
452 | }
453 | async loadSettings() {
454 | this.settings = Object.assign({}, DEFAULT_SETTINGS, await this.loadData());
455 | }
456 | async convertLegacySettings() {
457 | const legacySettingsPath = ".obsidian/rtl.json";
458 | if (await this.app.vault.adapter.exists(legacySettingsPath)) {
459 | const legacyContent = await this.app.vault.adapter.read(legacySettingsPath);
460 | if (legacyContent) {
461 | this.settings = JSON.parse(legacyContent);
462 | }
463 | this.app.vault.adapter.remove(legacySettingsPath);
464 | new import_obsidian3.Notice("RTL Plugin: legacy settings were converted to the new format");
465 | this.saveSettings();
466 | }
467 | }
468 | updateStatusBar() {
469 | let hide = true;
470 | let usedDefault = false;
471 | const view = this.app.workspace.getActiveViewOfType(import_obsidian3.MarkdownView);
472 | if (view && (view == null ? void 0 : view.editor)) {
473 | const direction = this.getDocumentDirection(view.editor, view);
474 | if (view.file && view.file.path)
475 | [, usedDefault] = this.getRequiredFileDirection(view.file);
476 | if (this.settings.statusBar) {
477 | let directionString = direction === "auto" ? "auto" : direction === "ltr" ? "LTR" : "RTL";
478 | let statusString = "";
479 | if (usedDefault)
480 | statusString = `Default (${direction})`;
481 | else {
482 | if (direction === "auto")
483 | statusString = "Auto";
484 | else
485 | statusString = directionString;
486 | }
487 | this.statusBarText.textContent = statusString;
488 | this.statusBarItem.style.display = null;
489 | hide = false;
490 | }
491 | }
492 | if (hide)
493 | this.hideStatusBar();
494 | }
495 | hideStatusBar() {
496 | this.statusBarItem.style.display = "none";
497 | }
498 | handleIframeEditor(editorDiv, editorView, file, autoDirectionPlugin) {
499 | const isInIframe = editorDiv.closest(".mod-inside-iframe");
500 | if (isInIframe) {
501 | if (editorDiv instanceof HTMLDivElement) {
502 | const [requiredDirection, _] = this.getRequiredFileDirection(file);
503 | this.adjustAutoDirection(editorView, requiredDirection, autoDirectionPlugin);
504 | this.setDocumentDirectionForEditorDiv(editorDiv, requiredDirection);
505 | }
506 | }
507 | }
508 | setMarkdownViewDirection(view, editor, editorView, newDirection, autoDirectionPlugin) {
509 | if (!view || !editor) {
510 | this.hideStatusBar();
511 | return;
512 | }
513 | let title = editorView.dom.querySelector(".inline-title");
514 | if (!title) {
515 | title = view.previewMode.containerEl.querySelector(".inline-title");
516 | }
517 | title == null ? void 0 : title.setAttribute("dir", newDirection === "auto" ? "auto" : "");
518 | this.adjustAutoDirection(editorView, newDirection, autoDirectionPlugin);
519 | const editorDivs = view.contentEl.getElementsByClassName("cm-editor");
520 | for (const editorDiv of editorDivs) {
521 | if (editorDiv instanceof HTMLDivElement)
522 | this.setDocumentDirectionForEditorDiv(editorDiv, newDirection);
523 | }
524 | const markdownPreviews = view.contentEl.getElementsByClassName("markdown-preview-view");
525 | for (const preview of markdownPreviews) {
526 | if (preview instanceof HTMLDivElement)
527 | this.setDocumentDirectionForReadingDiv(preview, newDirection);
528 | }
529 | if (this.settings.setNoteTitleDirection) {
530 | const container = view.containerEl.parentElement;
531 | let header = container.getElementsByClassName("view-header-title-container");
532 | header[0].style.direction = newDirection;
533 | }
534 | editor.refresh();
535 | if (newDirection !== "auto") {
536 | this.setExportDirection(newDirection);
537 | }
538 | }
539 | adjustAutoDirection(editorView, newDirection, autoDirectionPlugin) {
540 | const autoDirection = autoDirectionPlugin != null ? autoDirectionPlugin : editorView.plugin(this.autoDirectionPlugin);
541 | if (autoDirection) {
542 | autoDirection.setActive(newDirection === "auto", editorView);
543 | if (!autoDirectionPlugin)
544 | editorView.dispatch();
545 | }
546 | }
547 | setDocumentDirectionForEditorDiv(editorDiv, newDirection) {
548 | editorDiv.style.direction = newDirection === "auto" ? "" : newDirection;
549 | this.addDirectionClassToEl(editorDiv.parentElement, newDirection);
550 | }
551 | setDocumentDirectionForReadingDiv(readingDiv, newDirection) {
552 | readingDiv.style.direction = newDirection === "auto" ? "" : newDirection;
553 | this.addDirectionClassToEl(readingDiv, newDirection);
554 | readingDiv.classList.remove("rtl-yaml");
555 | if (newDirection !== "auto" && this.settings.setYamlDirection)
556 | readingDiv.classList.add("rtl-yaml");
557 | }
558 | setCanvasPreviewDirection(path, markdownPreviewElement) {
559 | const file = this.app.vault.getAbstractFileByPath(path);
560 | const [requiredDirection, _] = this.getRequiredFileDirection(file);
561 | this.setDocumentDirectionForReadingDiv(markdownPreviewElement, requiredDirection);
562 | }
563 | addDirectionClassToEl(el, direction) {
564 | switch (direction) {
565 | case "rtl":
566 | el.classList.remove(AUTO_CLASS);
567 | el.classList.add(RTL_CLASS);
568 | break;
569 | case "auto":
570 | el.classList.remove(RTL_CLASS);
571 | el.classList.add(AUTO_CLASS);
572 | break;
573 | default:
574 | el.classList.remove(RTL_CLASS);
575 | el.classList.remove(AUTO_CLASS);
576 | }
577 | }
578 | setExportDirection(newDirection) {
579 | this.replacePageStyleByString("searched and replaced", `/* This is searched and replaced by the plugin */ @media print { body { direction: ${newDirection}; } }`, true);
580 | }
581 | replacePageStyleByString(searchString, newStyle, addIfNotFound) {
582 | let alreadyExists = false;
583 | let style = this.findPageStyle(searchString);
584 | if (style) {
585 | if (style.getText() === searchString)
586 | alreadyExists = true;
587 | else
588 | style.setText(newStyle);
589 | } else if (addIfNotFound) {
590 | let style2 = document.createElement("style");
591 | style2.textContent = newStyle;
592 | document.head.appendChild(style2);
593 | }
594 | return style && !alreadyExists;
595 | }
596 | findPageStyle(regex) {
597 | let styles = document.head.getElementsByTagName("style");
598 | for (let style of styles) {
599 | if (style.getText().match(regex))
600 | return style;
601 | }
602 | return null;
603 | }
604 | switchDocumentDirection(editor, view) {
605 | let newDirection = this.getDocumentDirection(editor, view);
606 | if (newDirection === null) {
607 | new import_obsidian3.Notice("Obsidian RTL can't set the direction of this document");
608 | return;
609 | }
610 | let displayName = "";
611 | switch (newDirection) {
612 | case "ltr":
613 | newDirection = "rtl";
614 | displayName = "RTL";
615 | break;
616 | case "rtl":
617 | newDirection = "auto";
618 | displayName = "Auto";
619 | break;
620 | case "auto":
621 | newDirection = "ltr";
622 | displayName = "LTR";
623 | break;
624 | }
625 | if (view instanceof import_obsidian3.MarkdownView) {
626 | const editorView = view.editor.cm;
627 | this.setMarkdownViewDirection(view, editor, editorView, newDirection);
628 | if (this.settings.rememberPerFile && view.file && view.file.path) {
629 | this.settings.fileDirections[view.file.path] = newDirection;
630 | this.saveSettings();
631 | }
632 | new import_obsidian3.Notice(`Document direction set to ${displayName}`, 2e3);
633 | this.updateStatusBar();
634 | } else {
635 | const canvasView = this.getCanvasContext(view);
636 | if (canvasView) {
637 | if (view.file)
638 | new import_obsidian3.Notice("To change a canvas card direction, open the document separately and reload the canvas.");
639 | else
640 | new import_obsidian3.Notice("Can't change the direction of a card without a file.");
641 | }
642 | }
643 | }
644 | getCanvasContext(ctx) {
645 | if (ctx instanceof import_obsidian3.MarkdownView)
646 | return null;
647 | const possibleCanvasContainer = ctx == null ? void 0 : ctx.containerEl;
648 | if (possibleCanvasContainer && possibleCanvasContainer.hasClass("canvas-node-content"))
649 | return possibleCanvasContainer;
650 | }
651 | getDocumentDirection(_editor, ctx) {
652 | let refElement = null;
653 | if (ctx instanceof import_obsidian3.MarkdownView) {
654 | refElement = ctx.contentEl;
655 | } else {
656 | refElement = this.getCanvasContext(ctx);
657 | }
658 | if (refElement === null)
659 | return null;
660 | const rtlEditors = refElement.getElementsByClassName(RTL_CLASS), autoEditors = refElement.getElementsByClassName(AUTO_CLASS);
661 | if (rtlEditors.length > 0)
662 | return "rtl";
663 | else if (autoEditors.length > 0)
664 | return "auto";
665 | else
666 | return "ltr";
667 | }
668 | getFrontMatterDirection(file) {
669 | const fileCache = this.app.metadataCache.getFileCache(file);
670 | const frontMatter = fileCache == null ? void 0 : fileCache.frontmatter;
671 | if (frontMatter && (frontMatter == null ? void 0 : frontMatter.direction)) {
672 | try {
673 | const direction = frontMatter.direction;
674 | return direction;
675 | } catch (error) {
676 | }
677 | }
678 | }
679 | syncDefaultDirection() {
680 | const obsidianDirection = this.app.vault.getConfig("rightToLeft") ? "rtl" : "ltr";
681 | if (obsidianDirection != this.settings.defaultDirection && this.settings.defaultDirection !== "auto") {
682 | this.settings.defaultDirection = obsidianDirection;
683 | this.saveSettings();
684 | }
685 | }
686 | };
687 |
--------------------------------------------------------------------------------
/.obsidian/plugins/obsidian-rtl/manifest.json:
--------------------------------------------------------------------------------
1 | {
2 | "id": "obsidian-rtl",
3 | "name": "RTL Support",
4 | "version": "1.1.1",
5 | "minAppVersion": "0.15.3",
6 | "description": "Right to Left (RTL) text direction support for languages like Arabic, Hebrew and Persian (Farsi).",
7 | "author": "esm",
8 | "authorUrl": "",
9 | "isDesktopOnly": false
10 | }
11 |
--------------------------------------------------------------------------------
/.obsidian/plugins/obsidian-rtl/styles.css:
--------------------------------------------------------------------------------
1 | @media print {
2 | span.cm-tab {
3 | width: 50px !important;
4 | display: inline-block;
5 | }
6 |
7 | .is-auto .esm-ltr {
8 | direction: ltr;
9 | text-align-last: left;
10 | }
11 |
12 | .is-auto .esm-rtl {
13 | direction: rtl;
14 | text-align: right;
15 | }
16 | }
17 |
18 | /* List indent fix */
19 | .is-mobile .is-rtl .HyperMD-list-line, .is-mobile .HyperMD-list-line[dir="rtl"] {
20 | text-indent: 0px !important;
21 | padding-left: 0 !important;
22 | }
23 |
24 | .CodeMirror-rtl pre {
25 | text-indent: 0px !important;
26 | }
27 |
28 | /* Embedded links always LTR */
29 | .embedded-backlinks {
30 | direction: ltr;
31 | }
32 |
33 | /* Patch YAML RTL */
34 | /* In a preview that is strictly RTL (is-rtl) and the settings ask to right-aline YAML (rtl-yaml), set a YAML block to RTL. */
35 | .is-rtl.rtl-yaml code.language-yaml {
36 | text-align: right;
37 | }
38 | /* Then move the 'copy' button to the left */
39 | .is-rtl.rtl-yaml code.language-yaml + button.copy-code-button {
40 | right: unset;
41 | left: 0;
42 | }
43 | /* In a preview that is auto (is-auto), and the YAML was detected as RTL (esm-rtl), set the 'copy' button to the left */
44 | .is-auto .esm-rtl.language-yaml + button.copy-code-button {
45 | right: unset;
46 | left: 0;
47 | }
48 |
49 | /* In RTL, or in Auto with a first line that is RTL, set the flair (where it says e.g. 'yaml' in Edit mode) to the left */
50 | .is-rtl div:has(.HyperMD-codeblock-begin) .code-block-flair,
51 | .is-auto div:has(.HyperMD-codeblock-begin + .HyperMD-codeblock[dir="rtl"]) .code-block-flair {
52 | right: unset;
53 | left: 6px;
54 | }
55 |
56 | /* RTL and Auto callout titles that are detected as RTL - set to the right */
57 | .is-rtl .callout-title:has(.esm-rtl),
58 | .is-auto .callout-title:has(.esm-rtl) {
59 | direction: rtl;
60 | }
61 | .is-auto .callout-content .esm-rtl {
62 | direction: rtl;
63 | }
64 | /* When an RTL callout title was set to the right, left-justify its edit block button */
65 | .is-rtl div.cm-callout:has(.callout-title .esm-rtl) .edit-block-button,
66 | .is-auto div.cm-callout:has(.callout-title .esm-rtl) .edit-block-button {
67 | right: unset;
68 | left: var(--size-2-2);
69 | }
70 |
71 | .markdown-source-view .cm-line[dir="rtl"] .task-list-label {
72 | margin-left: 0;
73 | margin-right: -3px;
74 | }
75 |
76 | /* Better spacing between bullet and text */
77 | .outliner-plugin-better-bullets .markdown-source-view.is-rtl .cm-formatting-list-ul,
78 | .outliner-plugin-better-bullets .markdown-source-view .cm-line[dir="rtl"] .cm-formatting-list-ul {
79 | margin-right: 0;
80 | margin-left: 0.3em;
81 | }
82 |
83 | .markdown-source-view.is-rtl .is-collapsed .collapse-indicator svg.svg-icon,
84 | .markdown-source-view .cm-line[dir="rtl"] .is-collapsed .collapse-indicator svg.svg-icon {
85 | transform: rotate(90deg);
86 | }
87 |
88 | /* Styling for collapse indicator on the headings */
89 | .markdown-source-view.is-rtl .cm-line .cm-fold-indicator .collapse-indicator,
90 | .markdown-source-view .cm-line[dir="rtl"] .cm-fold-indicator .collapse-indicator {
91 | padding-right: 0;
92 | padding-left: 6px;
93 | right: -16px;
94 | }
95 |
96 | /* Styling for collapse indicator on the lists */
97 | .markdown-source-view.is-rtl .cm-line:not(.cm-active):not(.HyperMD-header):not(.HyperMD-task-line) .cm-fold-indicator .collapse-indicator,
98 | .markdown-source-view .cm-line[dir="rtl"]:not(.cm-active):not(.HyperMD-header):not(.HyperMD-task-line) .cm-fold-indicator .collapse-indicator {
99 | padding-right: 0;
100 | padding-left: 18px;
101 | right: -16px;
102 | }
103 |
104 | /* Styling for tags in RTL */
105 | .markdown-source-view.is-rtl .cm-line .cm-hashtag.cm-hashtag-begin,
106 | .markdown-source-view .cm-line[dir="rtl"] .cm-hashtag.cm-hashtag-begin {
107 | border-top-right-radius: var(--tag-radius);
108 | border-bottom-right-radius: var(--tag-radius);
109 | border-top-left-radius: 0;
110 | border-bottom-left-radius: 0;
111 | border-left: none;
112 | border-right: var(--tag-border-width) solid var(--tag-border-color);
113 | padding-right: var(--tag-padding-x);
114 | padding-left: 0;
115 | }
116 | .markdown-source-view.is-rtl .cm-line .cm-hashtag.cm-hashtag-end,
117 | .markdown-source-view .cm-line[dir="rtl"] .cm-hashtag.cm-hashtag-end {
118 | border-top-left-radius: var(--tag-radius);
119 | border-bottom-left-radius: var(--tag-radius);
120 | border-top-right-radius: 0;
121 | border-bottom-right-radius: 0;
122 | border-right: none;
123 | border-left: var(--tag-border-width) solid var(--tag-border-color);
124 | padding-left: var(--tag-padding-x);
125 | padding-right: 0;
126 | }
127 |
128 | .markdown-preview-view.is-auto .esm-rtl,
129 | .kanban-plugin__board .esm-rtl,
130 | .kanban-plugin__drag-container .esm-rtl {
131 | direction: rtl;
132 | text-align: right;
133 | }
134 |
135 | /* Moving bullets to right side of the page and adding enough space between the bullet and the text */
136 | .markdown-preview-view.is-auto .esm-rtl > .list-bullet,
137 | .markdown-preview-view.is-rtl .list-bullet {
138 | float: right;
139 | margin-right: -12px;
140 | }
141 |
142 | /* Fixing indentation guides in nested lists */
143 | .markdown-preview-view.is-auto.show-indentation-guide li.esm-rtl > ul::before,
144 | .markdown-preview-view.is-auto.show-indentation-guide li.esm-rtl > ol::before {
145 | left: auto;
146 | right: -15px;
147 | }
148 |
149 | /* Moving the collapse indicator to right side of the page */
150 | .markdown-preview-view.is-auto .esm-rtl > .collapse-indicator,
151 | .markdown-preview-view.is-rtl .collapse-indicator {
152 | float: right;
153 | }
154 |
155 | /* Moving the collapse indicator icon on the right of the text with enough space between */
156 | .markdown-preview-view.is-auto .esm-rtl > .list-collapse-indicator,
157 | .markdown-preview-view.is-rtl .list-collapse-indicator {
158 | margin-right: -48px;
159 | padding-left: 18px;
160 | }
161 |
162 | /* Moving the heading collapse indicator on the right of the text. Without
163 | This the collapse indicator will be over the heading text */
164 | .markdown-preview-view.is-auto .esm-rtl > .heading-collapse-indicator,
165 | .markdown-preview-view.is-rtl .heading-collapse-indicator {
166 | margin-right: -22px;
167 | }
168 |
169 | /* Mirroring collapse icon for nested lists so it points to rtl text not outside of page */
170 | .markdown-preview-view.is-auto .esm-rtl > .collapse-icon .is-collapsed svg.svg-icon,
171 | .markdown-preview-view.is-auto .esm-rtl.is-collapsed > .collapse-icon svg.svg-icon,
172 | .markdown-preview-view.is-rtl .collapse-icon .is-collapsed svg.svg-icon {
173 | transform: rotate(90deg);
174 | }
175 |
176 | /* Mirroring collapse icon for headings so it points to rtl text not outside of page */
177 | .markdown-preview-view .is-collapsed .esm-rtl > .collapse-icon svg.svg-icon,
178 | .markdown-preview-view.is-rtl .collapse-icon svg.svg-icon {
179 | transform: rotate(90deg);
180 | }
181 |
182 | /* Reverting the margin so the text won't stick to the checkbox */
183 | .markdown-preview-view.is-auto .esm-rtl > .task-list-item-checkbox,
184 | .markdown-preview-view.is-rtl .task-list-item-checkbox {
185 | margin-left: 6px;
186 | margin-right: 0;
187 | }
188 |
189 | .markdown-preview-view.is-auto .esm-ltr {
190 | direction: ltr;
191 | text-align-last: left;
192 | }
193 |
194 | /* Helper styles for debugging */
195 | /* .cm-line[dir="rtl"] { */
196 | /* border-right: dashed; */
197 | /* border-right-color: blue; */
198 | /* } */
199 | /* .cm-line[dir="ltr"] { */
200 | /* border-right: dashed; */
201 | /* border-right-color: red; */
202 | /* } */
203 |
--------------------------------------------------------------------------------
/.obsidian/workspace.json:
--------------------------------------------------------------------------------
1 | {
2 | "main": {
3 | "id": "bcae1f0fc23b0d4a",
4 | "type": "split",
5 | "children": [
6 | {
7 | "id": "b526b3650ef92ea9",
8 | "type": "tabs",
9 | "dimension": 53.899721448467965,
10 | "children": [
11 | {
12 | "id": "2986483b96741b56",
13 | "type": "leaf",
14 | "state": {
15 | "type": "markdown",
16 | "state": {
17 | "file": "Headlines/Main.md",
18 | "mode": "source",
19 | "source": true
20 | }
21 | }
22 | }
23 | ]
24 | },
25 | {
26 | "id": "c17065cfa2b707fb",
27 | "type": "tabs",
28 | "dimension": 46.10027855153203,
29 | "children": [
30 | {
31 | "id": "d4bed6ddc6bfc646",
32 | "type": "leaf",
33 | "state": {
34 | "type": "markdown",
35 | "state": {
36 | "file": "Headlines/Main.md",
37 | "mode": "preview",
38 | "source": false
39 | }
40 | }
41 | }
42 | ]
43 | }
44 | ],
45 | "direction": "vertical"
46 | },
47 | "left": {
48 | "id": "6d146ac35b5e6a61",
49 | "type": "split",
50 | "children": [
51 | {
52 | "id": "d7a93e10c9dee5a0",
53 | "type": "tabs",
54 | "children": [
55 | {
56 | "id": "2519e2fc0b9a9346",
57 | "type": "leaf",
58 | "state": {
59 | "type": "file-explorer",
60 | "state": {
61 | "sortOrder": "alphabetical"
62 | }
63 | }
64 | },
65 | {
66 | "id": "e9f5d3a81b988cc6",
67 | "type": "leaf",
68 | "state": {
69 | "type": "search",
70 | "state": {
71 | "query": "",
72 | "matchingCase": false,
73 | "explainSearch": false,
74 | "collapseAll": false,
75 | "extraContext": false,
76 | "sortOrder": "alphabetical"
77 | }
78 | }
79 | },
80 | {
81 | "id": "4f633c05b8b2ebbd",
82 | "type": "leaf",
83 | "state": {
84 | "type": "bookmarks",
85 | "state": {}
86 | }
87 | }
88 | ]
89 | }
90 | ],
91 | "direction": "horizontal",
92 | "width": 200,
93 | "collapsed": true
94 | },
95 | "right": {
96 | "id": "1f4a0c235bdfc39f",
97 | "type": "split",
98 | "children": [
99 | {
100 | "id": "7ce395e264c32abd",
101 | "type": "tabs",
102 | "children": [
103 | {
104 | "id": "5adde6f8455605be",
105 | "type": "leaf",
106 | "state": {
107 | "type": "backlink",
108 | "state": {
109 | "file": "Headlines/Main.md",
110 | "collapseAll": false,
111 | "extraContext": false,
112 | "sortOrder": "alphabetical",
113 | "showSearch": false,
114 | "searchQuery": "",
115 | "backlinkCollapsed": false,
116 | "unlinkedCollapsed": true
117 | }
118 | }
119 | },
120 | {
121 | "id": "78dcf24ecc8729d0",
122 | "type": "leaf",
123 | "state": {
124 | "type": "outgoing-link",
125 | "state": {
126 | "file": "Headlines/Main.md",
127 | "linksCollapsed": false,
128 | "unlinkedCollapsed": true
129 | }
130 | }
131 | },
132 | {
133 | "id": "44d86a831f243eff",
134 | "type": "leaf",
135 | "state": {
136 | "type": "tag",
137 | "state": {
138 | "sortOrder": "frequency",
139 | "useHierarchy": true
140 | }
141 | }
142 | },
143 | {
144 | "id": "3dbe339e31187180",
145 | "type": "leaf",
146 | "state": {
147 | "type": "outline",
148 | "state": {
149 | "file": "Headlines/Main.md"
150 | }
151 | }
152 | }
153 | ]
154 | }
155 | ],
156 | "direction": "horizontal",
157 | "width": 300,
158 | "collapsed": true
159 | },
160 | "left-ribbon": {
161 | "hiddenItems": {
162 | "switcher:Open quick switcher": false,
163 | "graph:Open graph view": false,
164 | "canvas:Create new canvas": false,
165 | "daily-notes:Open today's daily note": false,
166 | "templates:Insert template": false,
167 | "command-palette:Open command palette": false
168 | }
169 | },
170 | "active": "2986483b96741b56",
171 | "lastOpenFiles": [
172 | "src/img/hide_pass.png",
173 | "src/img/calc_str.png",
174 | "src/img/meme_copy.jpg",
175 | "src/img/py_index.png",
176 | "Headlines/Main.md",
177 | "README.md"
178 | ]
179 | }
--------------------------------------------------------------------------------
/Headlines/Main.md:
--------------------------------------------------------------------------------
1 |
2 |
3 | ## نکته:
4 |
5 | > **مشارکت کننده های مختلفی ممکنه روی این کتاب کار بکنن و نکات تخصصی تری رو بنویسن تا از دانش دوستان بهره مند بشیم. از همینجا عمیقا از دوستان مشارکت کننده معذرت میخوام که برای شروع نام خودمو بردم. کوچیک شما هم هستم ❤ .**
6 |
7 | ---
8 |
9 | ## معرفی نویسنده:
10 |
11 | خب سلام سلام. من علیرضا فاضلی هستم ، الان که این کتاب یا اگه بشه بهش گفت کتاب رو وقتی مینویسم که هجده سالمه ، حالا بعدا بزرگتر میشم :) .
12 | بنده حدود سه سالی هست که برنامه نویسی کار میکنم و توی حوزه های مختلف برنامه نویسی کار کردم ، اولش که صبح تا شب گیم میزدم مثل تمامی همسن و سالای خودم ، بعدش یکی از رفقا گفت یک زبان برنامی نویسی هست به نام پایتون بشین یادش بگیر خیلی باحاله ، اقا ما نشستیم یادش گرفتیم . مدتی باهاش کار کردیم تا اینکه وارد پروژه ای با دوست خوبم [سجاد عبدالهی](https://github.com/sajjadabd)
13 | شدم. و اونجا منو با JavaScript آشنا کرد و خلاصه یکسالو نیمی رفتم برای خودم که با جی اس کار کنم. حالا که رسیده به این زمان علاقه پیدا کردم که برم سمت هوش مصنوعی و بینایی کامپیوتر .
14 |
15 | ## چیشد که دارم این کتابو مینویسم ؟
16 |
17 | خب پیشنیاز اولیه یادگیری هوش مصنوعی ، زبان برنامه نویسی پایتون هستش ، من برای خودم دوره آموزشی پایتون از وبسایت [Zero To Mastery](https://zerotomastery.io/)
18 | انتخاب کردم. من همیشه عادت دارم که کوچکترین چیزیو که یاد میگیریم بیام توی دفترم بنویسم ، ولی این بار با خودم گفتم پسر یکم اپدیت بشو توی این قضیه . تصمیم گرفتم نکاتی که یاد میگیرم رو روی نرم افزار [Notion](https://notion.so)
19 | بنویسم. اومدم صفحه یادگیری نوشنم رو پابلیک کردم تا بقیه دوستان هم بیان نظرشونو بگن و توی این مطلب کمکم بکنن و توی توییتر توییتش کردم ، تا اینکه دوست عزیزم
20 | [محمد زرچی](https://github.com/mzarchi)
21 | بهم گفت که چرا توی گیتهاب نمیزاریش تا بقیه راحت تر بتونن توش مشارکت داشته باشن ، با خودم گفتم فکر خوبیه و این شد که الا توی گیتهاب در خدمتتون هستیم.
22 |
23 | ### بدون مقدمه بریم یکم پایتون بخونیم 😁.
24 |
25 | ### تاریخچه
26 |
27 | زمینه یادگیری عمیق هر چیزی شناخت تاریخچه و اهداف و علت های ساخت اون چیزه
28 |
29 | پایتون که امروز به یه زبان همه منظوره و مفسری شناخته میشه که اولین بار در سال 1991 عرضه شد
30 | نویسنده پایتون گیدو ون راسوم (Guido van Rossum) است که متولد 1956 و اهل هلند است
31 |
32 | ### علت نام گذاری پایتون
33 |
34 | نام زبان برنامهنویسی پایتون از علاقه نویسنده آن به کمدین
35 | بریتانیایی معروف، مونتی پایتون (Monty Python)، گرفته شده است.
36 | گویدو ون راسوم، نویسنده این زبان برنامهنویسی، به خاطر علاقه خود به
37 | این برنامه تلویزیونی کمدی و همچنین برای جذب توجه ویژهای به این زبان،
38 | از نام "پایتون" برای نامگذاری این زبان استفاده کرد.
39 |
40 | ### محبوبت و قدمت
41 |
42 | بر خلاف نظر اکثریت که فکر می کنند پایتون زبان جدیدیه، پایتون یه زبان نسبتا قدیمی حساب میشه
43 | علت این افکار عموما به این بر میگرده که پایتون توی سال های اخیر تازه بر سر زبان ها افتاده و تونسته جای خودش رو در صدر جدول برای چند سالی نگه داره
44 |
45 | برای مثال جاوااسکریپت (JavaScript) سال 1995 عرضه شد 5 سال بعد از پایتون
46 |
47 | روبی(Ruby) هم سال 1995 عرضه شد
48 |
49 | سی شارپ(C#) سال 2001 عرضه شد
50 |
51 | جولیا(Julia) سال 2012 عرضه شد
52 |
53 | گو(Go) سال 2009 عرضه شد
54 |
55 | ### چرا پایتون؟
56 |
57 | عموما پایتون زبانی سطح بالا با سینتکس راحت و خوانا نزدیک به زبان انسان است برای همین می تونه گزینه خوبه برای شروع برنامه نویسی باشه
58 | و همچنین با توجه به محبوبیت و رشد پایتون و همچنین پکیج های زیادی که داره میتونه یه انتخاب مناسب برای شروع و کار در فیلد های مختلف باشه
59 |
60 | ---
61 |
62 | ### چرا اینهمه زبان برنامه نویسی داریم ؟
63 |
64 | زبان های برنامه نویسی مثل ابزار های مختلف برای ساخت یک خونه میمونن مثل انبر ، چکش ، اره ، بیل ، کلنگ. هر کدوم از اینا برای کاری ساخته شدن ، مثلا با چکش نمیشه چاله کند.
65 |
66 | به عنوان مثال زبان پایتون یک زبان با سرعت پایین هستش و High level. ما میخوایم برای سخت افزارمون برنامه نویسی بکنیم و سرعت برنامه سخت افزاری ما باید زیاد باشه . ما نمیتونیم از زبانی مثل پایتون که به سخت افزار نزدیک نیست و توی این مورد سرعت پایینی داره استفاده بکنیم پس میایم از زبان اسمبلی یا سی استفاده میکنیم.
67 |
68 | زبان پایتون یک زبونیه که بهره وری رو بالاتر میبره به دلیل راحتی در کد و نزدیک بودن به زبان انگلیسی سرعت توسعه رو خیلی بالا میره.
69 |
70 | به طور خلاصه هر زبونی رو بهر کاری ساختن و هر زبونی توی یک سری کارها بهتر از بقیه زبون هاست.
71 |
72 | ---
73 |
74 | > accountability = مسئولیت
75 | > instructions = دستور عمل
76 | > gibberish = بیهودگی
77 | >
78 | > > valuable = hard to acquire
79 |
80 | ### نکته : همیشه بالای مطلبی معانی زبانی هستن که نوشتم ، این معانی خیلی توی دنیای کامپیوتر استفاده میشن پس به دردتون میخوره .
81 |
82 | ---
83 |
84 | زبان ماشین به صورت اعداد باینری (0 و 1) و یا بیت ها نوشته میشود. زبانی هست که فقط کامپیوتر (مدار های کامپیوتر) میفهمه و میتونه برنامه های مارو اجرا بکنه. و زبان های برنامه نویسی که ما باهاشون کار میکنیم و جوری طراحی شدن که برای ما قابل فهمه مثل زبان های برنامه نویسی پایتون ، جاوااسکریپت ، پایتون ، گولنگ ....
85 | زبان های میانی بین زبان ماشین و زبان انسان هستن . به خاطر همینه که ما راحت به حروف انگلیسی میتونیم برنامه های مختلف بسازیم وگرنه پوستمون کنده میشد.
86 |
87 | **زبان های Low level** : زبان هایی هستن که به زبان ماشین نزدیک تر هستند مثل c , c++ , assembly ... .
88 |
89 | **زبان های High Level** : زبان هایی که به زبان انسان نزدیک تر هستند ، مثل : python , JavaScipt ....
90 |
91 | #### به طور خلاصه :
92 |
93 | زبان سطح بالا به زبان هایی گفته میشه که به زبان ما انسان ها نزدیکه و درکش برای ما اسون و در عوض برای کامپیوتر سخته ولی زبان های سطح پایین برعکس برای ما سخت ولی برای کامپیوتر اسونه!
94 |
95 | ---
96 |
97 | 
98 |
99 |
100 | **Translator:** وظیفه مترجم اینه که زبان برنامه نویسی که ما باهاش کد میزنیم رو به زبان ماشین ترجمه بکنه ، به عنوان مثال ما داریم پایتون کد میزنیم و به پایتون میگیم که یه متنی رو برای من چاپ بگیر ، کامپیوتر نمیفهمه که من توی زبان پایتون چی نوشتم ، میگه که این چرتو پرت چیه تحویل من میدی ، اینجاست که مترجم ها وارد کار میشن و و اون چرت و پرت رو برای کامپیوتر به زبان ماشین ترجمه میکنن و کامپیوتر حالا میگه که اها داداش تو میخوای واست یه متنیه چاپ بگیرم ، بیا اینم متنت .
101 |
102 | #### انواع Translator ها :
103 |
104 | 1. compiler
105 |
106 | کار کامپایلر به این صورت هستش که میاد کد های مارو از اول و تا آخر میخونه اگر مشکلی ، اروری چیزی نداشت میاد کد مارو تبدیل به فایل اجرایی میکنه مثلا فایل .exe ، و هر سری برای اجرای این برنامه نیاز نیستش از اول این کد کامپایل بشه و دوبارخ فایل اجرایی جدید برای اجرا ساخته بشه ولی تا زمانی که بخواید توی کدتون تغیری ایجاد کنید ، اونموق دوباره نیازه که کدتون کامپایل بشه و خب سرعت زبان های کامپایلری از زبان های interpreter یا همون مفسری بیشتر . به عنوان مثال زبان های : C++ , C# , Java زبان های کامپایلری هستند.
107 |
108 | 1. interpreter
109 |
110 | مفسر میاد خط به خط کدامون رو میخونه و اگر اون خط مشکلی نداشت خروجی همونو بهمون میده و مفسر هیچ فایل اجرایی نداره چون کامپایل نمیشه و داره ترجمه میشه پس در نتیجه برای هربار اجرا باید این روند رو طی بکنه و همین موضوع سرعتش رو پایین میره !. زبان مفسری مثل : python , PHP , JavaScript , Ruby.
111 |
112 | ---
113 |
114 | ### برنامه نویسی به صورت انلاین
115 |
116 | شما برای برنامه نویسی به صورت انلاین ( فقط برای یاگیری ) میتونید از
117 | وبسایت های زیر استفاده کنید:
118 |
119 | - [Glot.io](https://glot.io)
120 | - [Repl.it](https://repl.it)
121 |
122 | ---
123 |
124 | ```py
125 | print(’hello world’)
126 | ```
127 |
128 | این دستور توی پایتون برای ما هر چی که بخوایم رو در درون ترمینال برای ما خروجی میگیره. این ساده ترین دستور درون پایتونه . به طور تخصصی به این اینا میگن سینتکس و این سینتکس ها از قبل درون زبان برنامه نویسی پایتون قرار داده شدند.
129 |
130 | ---
131 |
132 | ### نحوه تفسیر شدن کد پایتونی به زبان ماشین
133 |
134 |
135 |
136 | اول از همه ما کدی رو که توی پایتون مینویسم مثل همین `print('hello world')`
137 | ، این به مفسر پایتون داده میشه
138 | و بعدش اون مفسری که از قبل براش نوشتن ، میاد کد مارو به بایت کد ترجمه میکنه و اون بایت کد درون ماشین مجازی زبان سی به نام cpython قرار میگیره
139 | و اون ماشین مجازی ، بایت کد مارو به زبان ماشین تبدیل میکنه :) .
140 |
141 | ---
142 |
143 | ```py
144 |
145 | input('Whats your name ?')
146 |
147 | ```
148 |
149 | این تابع یا فعلا بهتره از لفظ تابع استفاده نکنیم ، چون زوده یکم ، بهتره بگیم این کد ، کارش اینه که میاد از ما ورودی دریافت میکنه ، از کجا ؟
150 | خب از ترمینال ما ، همونجایی که ما کد پایتونیمون رو خروجی میگیریم.
151 | به مثال زیر دقت کنید:
152 |
153 | 
154 |
155 |
156 | اگه دقت کنید میتونید ببینید ، از ما پرسیده که اسمت چیه ؟ خب من جواب دادم علیرضا. ولی این اسم نه جایی ذخیره شده نه حرکتی زده شده مثلا بیاد بگه سلام علیرضا.
157 |
158 | باید چیکار بکنیم ؟ اینو توی یک متفیر ذخیره بکنیم ، وقتی چیزی رو توی متفیر ذخیره میکنیم این توی مموریما میره و ذخیره میشه و ما میتونیم با این کار های مختلف بکنیم.
159 |
160 | ```py
161 |
162 | userName = input('whats your name ? ')
163 |
164 | print('Hello ' + userName)
165 |
166 | ```
167 |
168 |
169 | 
170 |
171 |
172 | و حالا میبینید که ما تونستیم از این تابع input استفاده بکنیم ، یک ورودی از کاربر دریافت بکنیم و اون ورودی رو درون متغیر بریزیم و از اون متغیر به عنوان خروجی استفاده بکنیم .
173 |
174 | ---
175 |
176 | # Python.3 vs Python.2
177 |
178 | > evolving = درحال تکامل | decided = تصمیم گرفت | legacy = میراث
179 |
180 | ### breaking changes :
181 |
182 | به اپدیتی گفته میشه که وقتی میاد دیگه اپلیکیشن ها برنامه ها و پروژه ها نمیتونن از اون اپدیت استفاده بکنن چون اصلا براشون طراحی نشده. به عنوان مثال وقتی پایتون 3 اومد دیگه شرکت ها نمیتونستن خودشونو تا مدت ها اپدیت بکنن و باید خط به خط پروژه هاشونو اپدیت میکردن. یعنی همه چی برای شرکتا ف\*\*اکداپ شده بود 😂.
183 |
184 | از سال 2008 سازنده پایتون تصمیم گرفت که ورژن جدید پایتون رو بسازه یعنی ورژن 3 که انقلابی در کامیونیتی پایتون بودش و اینکه اومد کلا تمامی زیرساخت های زبان پایتون رو از نو کوبید و ساخت باعث breaking changes شد.
185 |
186 | ### نمونه ای از کد های پایتون 2 و 3 :
187 |
188 | ```py
189 | #python 2 :
190 | print ‘hello world’
191 |
192 | #python 3 :
193 | print(’hello world’)
194 |
195 | ```
196 |
197 | ---
198 |
199 | ### Python Data Types - انواع داده در زبان پایتون
200 |
201 | > data = داده | type = نوع | fundamental = بنیادی ، اساسی
202 |
203 | اول بزار لیستی از دیتا تایپ های تو پایتون، توی پایتون رو بهت معرفی بکنم، فقط میخوایم به اسمشون اشنا بشیم:
204 |
205 | - ### Fundamental Data Types :
206 |
207 | 1. int
208 |
209 | ```py
210 | myAge = 18
211 | ```
212 |
213 | 1. float
214 |
215 | ```py
216 | myMoney = 3.9
217 | ```
218 |
219 | 1. str
220 |
221 | ```py
222 | myName = "Alireza Fazeli"
223 | ```
224 |
225 | 1. bool
226 |
227 | ```py
228 | single = True
229 | ```
230 |
231 | 1. list
232 | 1. tuple
233 | 1. set8
234 | 1. dict
235 |
236 | - ### Custom Data Types
237 |
238 | کلاس ها نمونه ای از دیتا تایپ های شخصی سازی شده هستند.
239 |
240 | > جلوتر به صورت تخصصی کلاس رو یاد میگیریم، فعلا فقط گوش ما باهاش اشنا بشه.
241 |
242 | - ### Specialized Data Types :
243 |
244 | > جلوتر به صورت تخصصی این بخش رو یاد میگیریم، فعلا فقط گوش ما باهاش اشنا بشه.
245 |
246 | ماژول ها نمونه ای از دیتا تایپ های خاص در پایتون هستنید
247 |
248 | - ### None
249 |
250 | ---
251 |
252 | ## چی میشه که ما بتونیم به راحتی از راحتی متغیرمون استفاده بکنیم
253 |
254 | خب ، مثلا فکر کنید میخواید یه برنامه بسازید ، که عملایت بعلاوه تو ریاضی رو انجام بده و ما میخوایم از مقدار قبلی توی متغیر استفاده بکنیم ، یکم گیج شدید 😂؟ منم گیج شدم بیا کدشو ببین :
255 |
256 | ```py
257 |
258 | numberOne = 2
259 |
260 | numberOne = 2 + 3
261 |
262 | ```
263 |
264 | کد بالارو نگاه کنید ، الان من میخوام از همون متغیر برای مقدار دهی استفاده کنم و متغیر جدیدی نیام نسازم. اما الان تو کد بالا ما اومدیم چرتو پرت نوشتیم ، اخه دو بعلاوه سه ؟ پس مقدار قبلی متغیر رو چجوری بگیریم ؟
265 | به روش زیر :
266 |
267 | ```py
268 |
269 | numberOne = 2
270 |
271 | numberOne = numberOne + 3
272 |
273 | ```
274 |
275 | به همین اسونی تونستیم مقدار قبلی متغیر رو توی همون متغیر بریزیم و یک عملایت جدید انجام بدیم . ولی میتونیم این کار رو خیلی راحت تر انجام بدیم ، یک عملی هست که توی تمام های زبان های برنامه نویسی هستش ، اسم تخصصیش میشه : _augmented assignment operator_ حالا حفظم نکردی نکردی این اسمو مهم نیست 😂😂.
276 |
277 | ```py
278 |
279 | numberOne = 2
280 |
281 | numberOne += 3
282 |
283 | ```
284 |
285 | خب این یعنی همون قطعه کد قبلی ولی ساده تر، اگه بخوام بگم میشه : نامبر وان بعلاوه مساوی هست با 3 . ایم سو خارجی 😎.
286 |
287 | ---
288 |
289 | ## استرینگ ها در زبان پایتون (آش رشته های برنامه نویسی )
290 |
291 | > string = رشته |
292 |
293 | آش رشته های برنامه نویسی، یا همون استرینگ ها (string).
294 | خب ما توی زبان های به متن ها میگیم استرینگ که معنی فارسیش میشه رشته. چرا ؟ چون حروف ها مثل رشته بهم دیگه وصل شدن، توی دنیای کامپیوتر هرکدوم این حروف یک کد باینری مخصوص خودشو داره و اینا وقتی بهم وصل میشن بهشون میگن استرینگ.
295 |
296 | ##### ما توی زبان برنامه نویسی پایتون به سه روش میتونیم از استرینگ ها استفاده کنیم :
297 |
298 | تک کوت : (Single Quote)
299 |
300 | ```py
301 |
302 | myName = `alireza`
303 |
304 | ```
305 |
306 | دابل کوت : (Double Quote) :
307 |
308 | ```py
309 |
310 | myName = "Alireza"
311 |
312 | ```
313 |
314 | لانگ استرینگ (Long String) :
315 | این برای چیه ؟ خب ما وقتی بخوایم متنی بلندی رو در زبان پایتون چاپ بگیریم میتونیم از لانگ استرینگ استفاده بکنیم. شما اقایون و خانوما نمیتونید از سینگل کوت و دابل کوت برای نوشتن متن های چند خطی استفاده بکنید.
316 | بریم که از لانگ استرینگ استفاده کنیم :
317 |
318 | ```py
319 |
320 |
321 | hayedeMusic = '''
322 | مـیگن مستی گناه به انگشت ملامت بایـد مستـها رو حد زد به شلاق ندامت
323 |
324 | سبوی ما شکستـه در مـیکده بستـه امـیـد همه ی ما به همت تـو بستـه
325 | '''
326 |
327 | ```
328 |
329 | اقا هایده گوش بدید موقع کد زدن، حلال حلاله 😂😂.
330 |
331 |
332 | 
333 |
334 | ---
335 |
336 | > concatenation = الحاق | first name = اسم کوچک | last name = فامیلی |
337 |
338 | ## الحاق رشته ها (Strings Concatenation) :
339 |
340 | **_خداوکیلی تبدیل این کلمات تخصصی سخته به فارسی. تا جایی که بشه سعی میکنم تبدیلشون بکنم ولی یکجایی نمیشه خدایی ._**
341 |
342 | ما یکجا هایی نیاز داریم که دوتا استرینگ رو بهم وصل بکنیم ، مثلا من دوتا متغیر دارم که یکیش اسم من و یکیش فامیلیه منه ، خب برای اینکار باید چیکار بکنم که توی یک استرینگ بیان ؟ باید از عملی استفاده بکنیم به نام string concatenation که از عملگر ریاضی بعلاوه میاد. کد زیر رو نگاه کنید ، چیز خاصی ندار اصلا :
343 |
344 | ```py
345 |
346 | firstName = 'alireza'
347 | lastName = 'fazeli'
348 |
349 | fullName = firstName + lastName
350 |
351 | # خروجی : alirezafazeli
352 | # برای اینکه بتونیم متنمون رو خوشگل تر بکنیم میتونیم از متن های دیگه استفاده بکنیم :
353 |
354 | fullName = 'Name :' + ' ' + firstName + ' . ' + 'last name :' + ' ' + lastName
355 |
356 | # حواستون هست که باید fullName رو پرینت بگیرید ؟
357 |
358 | print(fullName)
359 |
360 | # خروجی : Name : alireza . last name : fazeli
361 |
362 |
363 | ```
364 |
365 | ---
366 |
367 | ## الحاق رشته ها به روش حرفه ای ها !
368 | خب برای اینکه بخوایم رشته رو به هم الحاق کنیم یا از متغیر ها توی رشته هامون استفاده بکنیم، واقعا سخته که بیایم هی از عملگر ریاضی **(+)** استفاده کنیم. پس بریم با روش خیلی خفن پایتون 3 استفاده کنیم :) .
369 |
370 | ---
371 |
372 | ## Formatted String ( F string ):
373 |
374 | ما میتونیم در پایتون بدون اینکه نیازی باشه از عملگر برای الحاق رشته استفاده بکنیم ، میتونیم از چیزی به نام **F String** استفاده کنیم.
375 |
376 | ```py
377 | first_name = "alireza"
378 | last_name = "fazeli"
379 | full_name = f"Your Full Name Is : {first_name} - {last_name}"
380 |
381 | print(full_name)
382 |
383 | # خروجی
384 | # Your Full Name Is : alireza - fazeli
385 | ```
386 |
387 |
388 | به همین سادگی ما میتونیم از متغیر ها در رشته هامون استفاه بکنیم و نیازی نداریم که سختی بکشیم.
389 | اول از f در اول استرینگمون استفاده میکنیم ، و بعد هرجایی که نیاز بود یه پرانتز باز میکنیم و متغیرمون رو درونش قرار میدیم .
390 |
391 | ___
392 |
393 | > Function : تابع
394 | ## تابع های ریاضی (Math Functions) :
395 |
396 | > بزارید اول از همه یک چیزی رو بگم، ما قرار نیست تو پایتون یا هر زبان برنامه نویسی دیگه همه چیز رو یاد بگیریم، بلکه قرار چیزهایی رو یاد بگیریم که مورد نیازمونه و هرچیزی رو که نمیدونیم بریم سرچ بزنیم چون همه چیز کف اینترنت ریخته و ما نیاز داریم که پایه های کار رو بدونیم . 😃
397 |
398 | > یک نکته دیگه رو هم بگم اینکه فعلا کار به این نداشته باشید که تابع چیه چون که جلوتر مفصل دربارش حرف میزنم، فعلا فقط بدونید که تابع مثل یک کارخونست، یک ورودی بهش میدی و اون نسبت به اون ورودی بهت یک محصولی رو ارائه میده 💣.
399 |
400 |
401 | ## round() :
402 |
403 | این تابع از اسمش معلومه کارش چیه، اعداد رو برای ما روند میکنه یا گرد میکنه. این تابع اگه اعداد اعشاری، اعشارشون از پنج کمتر باشه، میاد رو به پایین گرد میکنه و اگه پنج یا بالاتر از پنج باشن، رو به بالا گرد میکنه. مثلا عدد 3.5 میشه 4 و عدد 3.4 میشه 3.
404 |
405 |
406 | ```py
407 | print(round(3.5)) # خروجی : 4
408 | print(round(3.4)) # خروجی : 3
409 | ```
410 |
411 | ## abs() :
412 |
413 | این فانکشن میاد علامت پشت یه عدد رو، بر میداره و برای ما خود اون عدد رو بر میگردونه به عنوان مثال اگه ما عدد (-8) داشته باشیم، این میاد (-) بر میداره و عدد 8 رو بر میگردونه.
414 | ```py
415 | print(abs(-8)) # خروجی : 8
416 | ```
417 |
418 | ---
419 | > Efficient : کارآمد ، موثر | Precedence : تقدم ، اولویت
420 |
421 | ## Operator Precedence (اولویت عملگرهای ریاضی) :
422 |
423 | در پایتون عملگر های ریاضی یک اولویت بندی دارن، دقیقا مثل ریاضی. به عنوان مثال شما قراره یک محاسباتی رو انجام بدین خب باید بدونید وقتی که دارید این محسبات رو انجام میدید بر چه اساسیه و اولویت های اون چی هستن.
424 | به ترتیب میریم جلو :
425 |
426 | **1- () ** :
427 | خب پرانتز اولویت اول رو داره و هرچیزی که درون پرانتز قرار بگیره اولویت اول رو داره. دقیقا تمام این اولویت ها مثل ریاضی که یادگرفتین هستن.
428 |
429 | **2- ** ** :
430 | توان ! . این عملگر همون توان در ریاضیات هستش ، با استفاده از این عملگر هر عددی رو میتونیم به توان عدد دیگری برسونیم.
431 |
432 | ```py
433 | print(2 ** 2) # دو به توان دو
434 | # خروجی : 4
435 | ```
436 |
437 | **3 - * ** :
438 | ضرب ! . اولویت بعدی با ضرب هستش.
439 |
440 | ```py
441 | print(2 * 2) # دو ضرب در دو
442 | # خروجی : 4
443 | ```
444 |
445 | **4- / ** :
446 | تقسیم ! . اولویت بعدی با تقسیم هستش ما میتونیم با این عملگر هر عددی رو تقسیم بر عدد دیگری کنیم.
447 |
448 | ```py
449 | print(8 / 2) # هشت تقسیم بر دو
450 | # خروجی : 4
451 | ```
452 |
453 | **5- + **:
454 | بعلاوه ! . خب بعلاوه بعلاوست دیگه 😂.
455 |
456 | ```py
457 | print(2 + 2) # دو بعلاوه دو
458 | # خروجی : 4
459 | ```
460 |
461 | **6- ( - )** :
462 | منها ! .
463 | ```py
464 | print(8 - 2) # هشت منها دو
465 | # خروجی : 6
466 | ```
467 |
468 |
469 | ---
470 | > sensitive : حساس | Variable : متغیر | Dynamic : پویا | Constant : ثابت
471 |
472 | ## متغیر ها (Variable) :
473 | خب ما درباره متغیر ها یکم حرف زدیم. و حالا دقیق تر ببینیم متغیر ها چی هستن؟
474 | متغیر ها مثل ظرف هایی هستن که داده های مارو نگهداری میکنن. به عنوان مثال کابری توی سایت من ثبت نام میکنه ، من کجا باید اسمشو نگهداری کنم و نشونش بدم؟ توی متغیر !. و خب این متغیر ها کجا ذخیره میشن؟ هر وقت که پروژمون رو ران میکنیم درون مموری کامپیوتری یه گوشه ای رو برای خودشون رزرو میکنن و داده هارو نگهداری میکنن.
475 | به صورت کلی تر، متغیر ها با یک آدرسی در یک جای مموری، فضایی رو اشغال میکنن تا value های مارو یا همون مقدار های ما یا داده های مارو درون اون فضا قرار بدن تا ما بتونیم در پروژمون ازش استفاده بکنیم.
476 |
477 | ### چجوری میتونیم از یک متغیر استفاده بکنیم؟ به صورت زیر :
478 | ```py
479 |
480 | user_name = "alireza fazeli"
481 | # یک اسمی برای متغیر انتخاب کردیم و یک مقداری رو ریختیم توش. اسم متغیر من user_name هست .
482 | # و مقدار من alirezafazeli
483 | ```
484 |
485 | > پایتون یک زبان dynamic type هستش. یعنی نیازی نیستش که ما برای اینکه متغیر تعریف کنیم به پایتون بگیم که آقا من قراره توی تو بیام استرینگ بریزم یا اینتیجر بریزم. پایتون کاری به این کارا نداره ! میگه هرچی دل تنگت میخواهد بریز تو من 😂.
486 |
487 | ### Case sensitive :
488 | پایتون یک زبان حساس به نوع نوشتاری متغیر هستش ، یعنی اینکه متغیر به نام : iq با iQ فرق داره و اگه متغیری با این دو نوع نوشتاری تعریف بکنی باهم دیگه فرق دارن، پس در نتیجه حواستون باشه ! .
489 |
490 | ### Constants :
491 | به متغیر هایی در زبان برنامه نویسی گفته میشه که قرار نیست هیچوقت مقادیر درونش تغییر بکنه.
492 | به عنوان مثال عدد پی یک عدد همیشه ثابته و اون عدد : 3.14 هستش. پس در نتیجه اگه من بخوام متغیری به نام عدد پی داشته باشم این هیچوقت قرار نیست تغییر بکنه و من به عنوان یک برنامه نویس باید منظورمو یک جوری به برنامه نویس های دیگه برسونم ! با چه روشی؟ به روش زیر :
493 |
494 | روش اول : در این روش اگه ما نام متغیرمون به صورت حروف بزرگ بنویسیم یا به اصطلاح upper case یعنی داریم میگیم که اون متغیر Constant هستش ! .
495 | ```py
496 | PI = 3.14 # این یکی متغیر ثابت هستش
497 | ```
498 |
499 | روش دوم : اگه دو خط تیره به اول متغیرمون اضافه بکنیم یعنی داریم میگیم که این متغیر ثابت یا constant هستش.
500 |
501 | ```py
502 | __PI = 3.14
503 | ```
504 |
505 | ---
506 |
507 | ## مقدار دهی متغیر در یک خط !
508 | شاید براتون جاب باشه ولی ما میتونیم چندین متغیر رو در یک خط مقدار دهی بکنیم و نیاز نباشه بیایم برای هر متغیر در هر خط مجزا مقدار دهی بکنیم.
509 |
510 | ```py
511 |
512 | a, b, c = 1, 2, 3
513 |
514 | # a = 1
515 | # b = 2
516 | # c = 3
517 |
518 | ```
519 |
520 |
521 | در این روش همونطوری که ما به ترتیب اومدیم اسم متغیر هارو نوشتیم همونجوری به ترتیب باید مقدار دهی بکنیم که متغیر اولی مقدارش میشه همون عدد اولی.
522 | به همین آسونی !
523 |
524 | ---
525 |
526 |
527 |
528 | ## Type Conversion :
529 |
530 | شاید براتون سوال باشه که آیا ما میتونیم نوع داده هارو به یکدیگر تبدیل بکنیم یا نه ؟
531 | مثلا یک استرینگ '3' رو آیا میتونیم به اینتیجر 3 تبدیل کنیم ؟ باید بگم بله این امکان پذیره !
532 |
533 | ### تابع Type :
534 | ما با استفاده از تابع type در زبان برنامه نویسی پایتون میتونیم بفهمیم که آقا نوع این داده ما چی هستش به عنوان مثال برنامه به ما میگه خروجی شما عدد 100 هستش ! آیا این عددی که داری به من میدی 100 از نوع استرینگ هستش ("100") یا از نوع اینتیجر (100) ؟! با استفاده از این تابع ما میتونیم این موضوع رو بفهمیم.
535 |
536 | ```py
537 | number_one = 100
538 | number_two = '100'
539 | user_name = 'alireza fazeli'
540 | is_married = True
541 |
542 |
543 | print(type(number_one)) # خروجی : int
544 | print(type(number_two)) # خروجی : str
545 | print(type(user_name)) # خروجی : str
546 | print(type(is_married)) # خروجی : bool
547 | ```
548 |
549 |
550 | ### تبدیل داده ها به string :
551 | ما میتونیم هر داده ای رو با استفاده از تابع string تبدیل بکنیم به نوع داده string کنیم.
552 | به عنوان مثال من در کد زیر میخوام عدد 100 رو که از نوع داده اینتیجر هستش رو به استرینگ تبدیل کنم .
553 |
554 | ```py
555 |
556 | number_one = 100
557 | number_two = str(number_one)
558 | print(number_two) # خروجی : 100
559 | print(type(number_two)) # حروجی : str
560 |
561 | ```
562 |
563 |
564 | ### تبدیل داده ها به int :
565 | ما میتونیم هر داده ای رو با استفاده از تابع int تبدیل بکنیم به نوع داده int کنیم .
566 | به عنوان مثال من در کد زیر میخوام عدد "100" رو که از نوع داده string هستش رو به int تبدیل کنم .
567 | این تابع هم کاراییش دقیقا مثل بالایی هستش فقط با این تفاوت که نوع تبدیل داده فرق میکنه.
568 |
569 | ```py
570 |
571 | number_one = "100"
572 | number_two = int(number_one)
573 | print(number_two) # خروجی : 100
574 | print(type(number_two)) # حروجی : int
575 |
576 | ```
577 |
578 |
579 | ---
580 |
581 | ## Escape Sequences :
582 |
583 | این مورد مثل جادو میمونه، ما میتونیم از یکسری ورد های جادویی توی استرینگ هامون استفاده بکنیم .
584 | به طور کلی Escape Sequences ها یکسری دستور عمل یا دستور هستن که فرم استرینگ مارو تغیر میدن.
585 |
586 | به عنوان مثال اگه من بخوام از دوتا تک کوتیشن یا دوتا دابل کوتیشن توی کدم استفاده بکنم نمیشه.
587 | من نمیتونم مثل کد زیر از استرینگ ها استفاده بکنم.
588 | چرا؟ اگه دقت بکنید میبینید اگه مات در درون یک کوتیشن از یک کوتیشن دیگه استفاده بکنیم انگار داریم دوتا استرینگ مجزا تعریف میکنیم و پایتون گیج میشه و میگه داداش داری چیکار میکنی ؟ 🤷♂️😐
589 |
590 | ```py
591 | "This is Alireza Fazeli From "Iran" " # ارور میده ❌
592 |
593 | 'This is Alireza Fazeli From 'Iran' ' # ارور میده ❌
594 |
595 | ```
596 |
597 | > یادتون نره برنامه نویس ها جادوگر هستن و میتونن جادو بکنن. پس بریم جادوگری یاد بگیریم.
598 | >
599 |
600 | ### ( \ ) :
601 |
602 | بک اسلش ! اگه از همین اسلش ساده توی کدتون استفاده بکنید دارید به پایتون میگید که که بعد از اسلش هر چیزی اومد رو یک استرینگ در نظر بگیر نه یک دستور ناشناخته. شل کن پایتون جان :)
603 |
604 | ```py
605 |
606 | quote = "This Is Alireza Fazeli From \"Iran\" " # دیگه اروری نمیده و دابل کوتیشن های مارو به عنوان یک استرینگ شناخت نه به عنوان دو استرینگ مجزا !
607 | ```
608 |
609 | ### ( \t ) :
610 |
611 | وقتی (بک اسلش تی) توی استرینگ استفاده بشه، میاد از هرجایی که استفاده شده ، به اندازه یک تب (Tab) برای ما فاصله میندازه.
612 |
613 | ```py
614 |
615 | music = "کفتر کاکل به سر \t وای فای"
616 | print(music) # خروجی : کفتر کاکل به سر وای فای
617 |
618 | ```
619 |
620 | ### ( \n ) :
621 |
622 | وقتی از این دستور در درون استرینگمون بیایم استفاده بکنیم ، میاد از هرجایی که استفاده شده میپره رو خط جدید ادامه استرینگ رو از خط جدید ادامه میده. معنی \n یعنی new line هستش.
623 |
624 | ```py
625 |
626 | music = " Nazi naz kon ke nazet \n ye sarve naze "
627 | print(music)
628 |
629 |
630 | # خروجی : Nazi naz kon ke nazet
631 | # ye sarve naze
632 |
633 | ```
634 |
635 |
636 | ---
637 |
638 | ## String Index :
639 | یکی از بخش های جذاب با جادوگری های جذاب همین بخش string index هستش.
640 | به طور کلی و ساده میشه گفت که استرینگ ها از حروف تشکیل شدن و این حروف ها هم در مموری جایگاهی دارن. مثلا حرف a از جمله alireza در مموری یک ادرسی و جایگاهی داره که ما میتونیم بهش دسترسی داشته باشیم. و با این حروف و اون استرینگ بازی بکنیم یا یکسری استفاده ها بکنیم.
641 |
642 | خب چجوری میتونیم به این حروف دسترسی داشته باشیم؟ اول از همه باید گفت شمارش در برنامه نویسی از عدد 0 هستش.
643 | پس وقتی ما بخوایم به خونه یک در یک استرینگ دسترسی داشته باشیم باید از عدد 0 استفاده بکنیم.
644 |
645 | #### ایندکس :
646 | به جایگاه های هر خونه از اون استرینگ ایندکس گفته میشه که از عدد صفر شروع میشه . حالا این ایندکس جاهای دیگه ای غیر استرینگ ها هم استفاده میشه که مهم ترین استفاده اش در list ها هستش. جلوتر به این موضوع می پردازیم.
647 |
648 | 
649 |
650 | بریم چندتا مثال حل بکنیم !
651 |
652 | #### مثال :
653 | ما میخوایم به حروف a از کلمه alireza دسترسی داشته باشیم.
654 | برای این منظور باید به صورت زیر عمل کنیم.
655 |
656 | ```py
657 |
658 | name = "alireza"
659 | print(name[0]) # ایندکس صفر برابر هستش با حروف اول این استرینگ
660 |
661 | # خروجی : a
662 |
663 |
664 | # ----------------------------
665 |
666 |
667 | print(name[3])
668 | # خروجی : r
669 |
670 | ```
671 |
672 | #### انتخاب بخشی خاص از یک استرینگ :
673 | حالا ما میتونیم بخش خاصی از یک استرینگ رو به راحتی برش بزنیم و بگیریم تو مشتمون.
674 | برای این منظور اول بهش میگیم که از کدوم ایندکس شروع بشه تا کدوم ایندکس ادامه داشته باشم.
675 |
676 | ```py
677 |
678 | name = "alireza fazeli"
679 | print(name[0:7])
680 |
681 | # خرجی : alireza
682 |
683 | ```
684 |
685 | نکته که ای که باید در نظر داشته باشید اینه که وقتی دارید ایندکس دوم رو وارد میکنید باید یک عدد بیشتر وارد بکنید .
686 |
687 | #### انتخاب حروف بر اساس گام :
688 | ما میتونیم حروف رو در string index وقتی برش میدیم و انتخاب میکنیم ، بر اساس گام ها باشه. مثلا حروف دوتا دوتا بره یا سه تا تا بره جلو تا به اون ایندکس مقصد برسه.
689 | بزارید اینجور بگم که مثلا من گفتم که از ایندکس 20 تا 50 یک استرینگ رو برای من بگیر و بیار. حالا میتونم بهش بگم وقتی داری میری از ایندکس 20 تا 50 میاری در این فاصله به صورت چندتا چندتا بیاری؟
690 |
691 | بریم کد رو ببینیم تا بفهمیم :
692 |
693 | ```py
694 |
695 | quote = "123456789"
696 |
697 | print(quote[0:6:2])
698 |
699 | # خروجی : 135
700 |
701 | ```
702 |
703 | بهش گفتم که از ایندکس 0 تا ایندکس 6 رو به صورت یکی درمیون برام بگیره و بیاره. که از عدد 1 تا 5 اگه ما یکی در میون بریم جلو، اعداد 1 ، 3 ، 5 برای ما در میاد.
704 |
705 |
706 | > # [start : stop : over]
707 | > # [گام : پایان : شروع]
708 |
709 |
710 |
711 |
712 |
713 |
714 | #### خالی گذاشتن ایندکس :
715 | ما در string index اگه خونه ای ایندکسمون رو خالی بزاریم در واقع داریم یک معنی خاصی رو به زبان پایتون میرسونیم.
716 |
717 | - اگه خونه اول رو خالی بزاریم یعنی از ایندکس صفر شروع بکن.
718 | - اگه خونه دوم رو خالی بزاریم یعنی اخرین خونه ایندکس ما . مثل اگه 10 تا ایندکس داشته باشیم ، خالی گذاشتن به معنای عدد 10 هستش.
719 | - خونه سوم اگه خالی بشه یعنی یک یکی به صورت عادی ایتم های درون استرینگ رو جلو بره.
720 |
721 |
722 |
723 |
724 | 
725 |
726 |
727 | ---
728 |
729 |
730 | > immutability : تغییر ناپذیری | greet : تبریک گفتن ، سلام دادن
731 |
732 |
733 | ## Immutability :
734 |
735 | یکی از بحث های بسیار مهم بحث immutability در زبان پایتون هستش که باید درکش بکنید.
736 | استرینگ ها در زبان پایتون تغییر ناپذیر هستند. به عنوان مثال ما میتونیم محتوای یک متغیر رو تغییر بدیم :
737 | ```py
738 |
739 | name = "alireza"
740 | print(name)
741 | # خروجی : alireza
742 |
743 | name = "sasan"
744 | print(name)
745 | #خروجی : sasan
746 |
747 | ```
748 |
749 | ولی نمیتونیم محتوای ایندکس یک استرینگ رو تغییر بدیم. به عنوان مثال من اگه یک استرینگ به نام 'alireza' تعریف کرده باشم، دیگه نمیتونیم بیام مثلا حروف اول علیرضا که a هستش رو تبدیل بکنم به z .
750 | این مورد در زبان برنامه نویسی پایتون غیر امکان پذیره که ما ساختار یک استرینگی رو تغییر بدیم.
751 | ما با استرینگ ها نمیتونیم به شکل زیر رفتار بکنیم :
752 |
753 | ```py
754 |
755 | name = "alireza"
756 | name[0] = "z" # امکان تغییر ساختار یک استرینگ وجود نداره !
757 | print(name) # خروجی : TypeError: 'str' object does not support item assignment
758 |
759 | ```
760 |
761 | ما فقط میتونیم محتوای درون یک متغیر رو تغییر بدیم که تو مثال قبلی دیده بودید. تنها راه تغییر یک استرینگ اینه که ما یک استرینگ جدید ایجاد بکنیم یا به اصطلاح، produce بکنیم.
762 | جلوتر درباره این موضوع صحبت میکنیم.
763 |
764 | ---
765 |
766 | #### len() :
767 |
768 | این یک تابع built in یا از پیش ساخته شده در زبان پایتون هستش که کارایی های بسیار زیادی داره.
769 | ما میتونیم با استفاده از این تابع، هر چیزی که قابل اندازه گیری باشه رو اندازه گیری بکنیم.
770 | با استفاده از این تابع ما میتونیم تعداد آیتم های درون یک لیست ، آرایه ، دیکشنری ... ، یا استرینگ رو بفهمیم.
771 | منظور از تعداد آیتم های یک استرینگ همون تعداد حروف یک استرینگ هستش. مثلا کلمه alireza از چند حروف تشکیل شده !؟ .
772 |
773 | نکته : تابع len میاد مثل یک انسان عادی برای با از 1 میشماره، نه صفر. حواستون باشه خلاصه !
774 |
775 | بریم ببینیم چجوری کار میکنه :
776 |
777 | ```py
778 |
779 | name = "alireza"
780 | last_name = "fazeli"
781 | greet = "Ye Toop Daram Ghel ghelie !"
782 |
783 | print(len(name)) # خروجی : 7
784 | print(len(last_name)) # خروجی : 6
785 | print(len(greet)) # خروجی : 27
786 |
787 | ```
788 |
789 | ---
790 |
791 | ## پروژه تمرینی ( محسابه گر استرینگ ) :
792 |
793 | میخوایم باهم یک پروژه تمرینی بزنیم و یکم کیف کنیم 😁. اول از همه میخوایم از کاربر یک ورودی بگیریم، بعدش بیایم تعداد مقادیر استرینگ ورودی کاربر رو محاسبه بکنیم و بعد به کاربر بگیم که داداش ، این متن تو ، این تعداد مقادیر تو، حالشو ببر دیگه.
794 | سعی کنید این مور رو خودتون انجام بدید.
795 | اگه دادید چه خوب ، اگه نتونستید سورس کد پایین رو ببینید که کامل انجامش دادم.
796 |
797 | ```py
798 |
799 | get_input = input("داداچ یه چیزی بنویس : ")
800 | calc_input = len(get_input)
801 |
802 | show_msg = f"""
803 |
804 | داداچ متن تو این بود : {get_input}
805 | تعداد حروفات انقدره : {calc_input}
806 |
807 | نه جان من حال کردی؟ 💣
808 |
809 |
810 | """
811 |
812 | print(show_msg)
813 |
814 | ```
815 |
816 |
817 | #### خروجی :
818 |
819 | 
820 |
821 | ---
822 |
823 |
824 |
825 | ## Method :
826 |
827 | متود ها شبیه به فانکشن ها هستن ولی متعلق به یک چیزین. برای یک چیز خاص یک کار خاصی رو انجام میدن.
828 | جلوتر به صورت کاملا مفصل درباره اینا اشنا میشیم، ولی برای شروع همینکه بدونیم متود ها برای یک سری چیزا هستن کافیه. مثلا استرینگ ها یکسری متود ها دارن که برای استرینگ ها یکسری کارهارو انجام میدن. مثلا یکی از متود ها میاد استرینگ مارو تمام حروف هاشو بزرگ میکنه یا یکی کوچیک میکنه.
829 | خلاصه هرکدوم از این استرینگ هارو بهر کاری ساخته اند !.
830 |
831 |
832 | ---
833 |
834 | #### String Method :
835 | متود هایی که متلع به استرینگ ها در پایتون هستند رو string method میگن که مثالشو بالا براتون زدم. که چجوریاست.
836 | برای اینکه ما از این متو ها استفاده بکنیم نیازه که بعد استرینگ یا بعد از متغیر حاوی یک استرینگ بیایم اون متود رو بهش اضافه بکنیم.
837 | به عنوان مثال :
838 | ```py
839 | "hello".upper()
840 |
841 | # یا
842 |
843 | name = "alireza"
844 | name.upper()
845 | ```
846 |
847 |
848 |
849 |
850 |
851 | #### .upper() :
852 |
853 | این متود کارش اینه که میاد حروف های استرینگ مارو به حروف های بزرگ تبدیل میکنه.
854 | مثلا اگه من در استرینگم، یک حرف a داشته باشم اون میاد تبدیلش میکنه به A . یا اگه salam داشته باشیم تبدیل میکنه به SALAM . به همین اسونی.
855 |
856 | مثال :
857 |
858 | ```py
859 |
860 | name = "alireza"
861 | letter = "j"
862 |
863 | print(name.upper()) # خروجی : ALIREZA
864 | print(letter.upper()) # خروجی : J
865 |
866 | ```
867 |
868 |
869 | > نکته : اگه شما این متود رو برای متغیر تون استفاده بکنید و اوت متغیرتون رو پرینت بگیرید. میبینید که متغیر شما هیچ تغییری نمیکنه. علتش چیه؟ علتش اینه که استرینگ همونجوری که گفته بودیم immutable هستش . شما برای اینکه محتوای درون متغیر خودتون رو تغییر بدید، باید با محتوای جدیدی که ساختیت جایگزین بکنید. شما در واقع با استفاده از این متود یک مقدار جدید produce کردید.
870 |
871 | نحوه جایگزینی با مقدار جدید :
872 |
873 | ```py
874 |
875 | name = "alireza"
876 | name = name.upper()
877 |
878 | print(name) # خروجی : ALIREZA
879 | ```
880 |
881 | الان میبینید که خروجی متغیر ما تغییر کرده.
882 |
883 | #### .lower() :
884 |
885 | این متود دقیقا مثل متود بالایی هستش با این تفاوت جای اینکه بیاد حروف هارو بزرگ بکنه ، کوچیک میکنه. یعنی ما اگه داشته باشیم A این میکنه a.
886 | به همین آسونی ! .
887 |
888 | مثال :
889 |
890 | ```py
891 |
892 | name = "ALIREZA FAZELI"
893 | letter = "B"
894 |
895 | print(name.lower()) # خروجی : alireza fazeli
896 | print(name.lower()) # خروجی : b
897 |
898 | ```
899 |
900 |
901 | #### .capitalize() :
902 | این متود میاد فقط اولین حروف از استرینگ مارو بزرگ میکنه. یعنی اگه ما استرینگ داشته باشیم : alireza fazeli این میاد تبدیل میکنه به Alireza fazeli .
903 |
904 | ```py
905 |
906 | name = "james clear"
907 | print(name.capitalize()) # خروجی : James clear
908 |
909 | ```
910 |
911 |
912 | #### .find() :
913 | این متود از اسمش معلومه، find،به معنای پیدا کردن.
914 | این میره توی استرینگ برای ما میگرده که آیا یک حروفی، جمله ای، کلمه ای، درون اون استرینگ برای وجود داره یا خیر. اگر وجود داشته باشه، فقط اون اولین موردی که پیدا کرد رو اون ایندکس اولش رو برای میفرسته. به عنوان مثال من یک جمله دارم : To be or not to be که توی این جمله از چند تا be تشکیل شده که من میگم برو پیدا بکن که توی استرینگ من آیا اصلا be هست ؟ این میگه اره هست ، چندتا هم هست. برای من اون ادرس ایندکس اون اولین موردی که پیدا کرد رو میفرسته. دیگه بقیه رو نمیگه، میگه به من چه، خودت برو پیدا بکن.
915 | اگر پیدا نکرد، برای ما عدد -1 رو بر میگردونه.
916 |
917 |
918 | ```py
919 |
920 | greet = "to be or not to be"
921 |
922 | print(greet.find("be")) # خروجی : 3 . این عدد 3 همون ایندکس 3 هستش.
923 |
924 | ```
925 |
926 | > نکته : ما میتونیم به متود فایند بگیم که از کجا تا کجای استرینگ مارو بگرده به این صورت که ایندکس اول اون کلمه ای که مدنظرمونه، ایندکس دوم اینکه از کجای استرینگ یا از کدوم ایندکس بگرده، و ایندکس سوم اینکه تا کجای استرینگ و تا کدوم ایندکس بگرده.
927 |
928 | مثال :
929 | ```py
930 |
931 | greet = "to be or not to be"
932 | print(greet.find("not", 8, 12)) # خروجی : 9
933 |
934 | ```
935 |
936 |
937 | #### .replace() :
938 |
939 | این متود هر حروفی، جمله ای ، کلمه ایکه ما بهش بگیم رو توی تمام اون جمله با چیزی که ما بهش میگیم عوض میکنه.
940 | به عنوان مثال جمله to be or not to be رو در نظر بگیرید.
941 | اگه من بهش بگم که be رو به duck عوض بکن ، این میاد تمامی be هارو با duck عوض میکنه.
942 | و جمله ما میشه to duck or not to duck .
943 |
944 | ```py
945 |
946 | greet = "to be or not to be"
947 | greet = greet.replace("be", "duck")
948 | print(greet) # خروجی : to duck or not to duck
949 |
950 | ```
951 |
952 | ---
953 |
954 | ## Boolean :
955 |
956 | بولین ها یک نوع داده در زبان برنامه نویسی پایتون هستند. این نوع داده دوتا هم بیشتر نیست.
957 | بله !
958 | خیر !
959 | فقط همین ! . بله و خیر.
960 | True به معنای بله هستش و False به معنای خیر.
961 | کابرد اینا کجاست ؟
962 | به عنوان مثال فرض بکنید که شما یک وبسایتی دارید که قراره از کاربر یکسری اطلاعاتی رو بگیرید . یکی از اون اطلاعات ها این هستش که آیا ازدواج کرده یا خیر؟ خب این جواب دو گزینه بیشتر نداره شما یا باید بگید بله یا خیر.
963 | همین ! .
964 |
965 | ```py
966 |
967 | is_married = True
968 | print(is_married) # خروجی : True
969 |
970 | is_married = False
971 | print(is_married) # خروجی : False
972 |
973 | ```
974 |
975 | ---
976 |
977 | > prons and cons : مزایا و معایب
978 |
979 | #### تکرار استرینگ :
980 | شاید براتون جالب باشه . ما در زبان پایتون میتونیم استرینگ هارو بدون نیاز به حلقه ها که جلوتر دربارش یاد میگیرید تکرار بکنیم.
981 | فقط کافیه اون استرینگ مورد نظر رو ضربدر اون تعداد بکنیم.
982 |
983 | ```py
984 |
985 | print("*" * 10) # خروجی : **********
986 |
987 | ```
988 |
989 | #### پروژه (مخفی کردن پسورد) :
990 | بریم باهم یک پروژه ای بسازیم که نام کاربری مارو ازمون میگیره و بعد پسورد مارو ازمون میگیره و نسبت به تعداد حروف پسوردمون اونو برای ما مخفی میکنه و جاش * میزاره.
991 |
992 |
993 | ```py
994 |
995 | get_username = input("لطفا نام کاربری را وارد کنید : ")
996 | get_password = input("لطفا پسورد خود را وارد کنید : ")
997 | hide_password = "*" * len(get_password)
998 | greet_to_user = f"""
999 |
1000 | سلام {get_username} پسورد {hide_password} در سیستم وارد شد. 😊
1001 |
1002 | """
1003 |
1004 | print(greet_to_user)
1005 |
1006 | ```
1007 |
1008 | خروجی :
1009 | 
1010 |
1011 |
1012 | ---
--------------------------------------------------------------------------------
/Headlines/Main.md.backup:
--------------------------------------------------------------------------------
1 |
13 |
14 | ## نکته:
15 |
16 | > **مشارکت کننده های مختلفی ممکنه روی این کتاب کار بکنن و نکات تخصصی تری رو بنویسن تا از دانش دوستان بهره مند بشیم. از همینجا عمیقا از دوستان مشارکت کننده معذرت میخوام که برای شروع نام خودمو بردم. کوچیک شما هم هستم ❤ .**
17 |
18 | ---
19 |
20 | ## معرفی نویسنده:
21 |
22 | خب سلام سلام. من علیرضا فاضلی هستم ، الان که این کتاب یا اگه بشه بهش گفت کتاب رو وقتی مینویسم که هجده سالمه ، حالا بعدا بزرگتر میشم :) .
23 | بنده حدود سه سالی هست که برنامه نویسی کار میکنم و توی حوزه های مختلف برنامه نویسی کار کردم ، اولش که صبح تا شب گیم میزدم مثل تمامی همسن و سالای خودم ، بعدش یکی از رفقا گفت یک زبان برنامی نویسی هست به نام پایتون بشین یادش بگیر خیلی باحاله ، اقا ما نشستیم یادش گرفتیم . مدتی باهاش کار کردیم تا اینکه وارد پروژه ای با دوست خوبم [سجاد عبدالهی](https://github.com/sajjadabd)
24 | شدم. و اونجا منو با JavaScript آشنا کرد و خلاصه یکسالو نیمی رفتم برای خودم که با جی اس کار کنم. حالا که رسیده به این زمان علاقه پیدا کردم که برم سمت هوش مصنوعی و بینایی کامپیوتر .
25 |
26 | ## چیشد که دارم این کتابو مینویسم ؟
27 |
28 | خب پیشنیاز اولیه یادگیری هوش مصنوعی ، زبان برنامه نویسی پایتون هستش ، من برای خودم دوره آموزشی پایتون از وبسایت [Zero To Mastery](https://zerotomastery.io/)
29 | انتخاب کردم. من همیشه عادت دارم که کوچکترین چیزیو که یاد میگیریم بیام توی دفترم بنویسم ، ولی این بار با خودم گفتم پسر یکم اپدیت بشو توی این قضیه . تصمیم گرفتم نکاتی که یاد میگیرم رو روی نرم افزار [Notion](https://notion.so)
30 | بنویسم. اومدم صفحه یادگیری نوشنم رو پابلیک کردم تا بقیه دوستان هم بیان نظرشونو بگن و توی این مطلب کمکم بکنن و توی توییتر توییتش کردم ، تا اینکه دوست عزیزم
31 | [محمد زرچی](https://github.com/mzarchi)
32 | بهم گفت که چرا توی گیتهاب نمیزاریش تا بقیه راحت تر بتونن توش مشارکت داشته باشن ، با خودم گفتم فکر خوبیه و این شد که الا توی گیتهاب در خدمتتون هستیم.
33 |
34 | ### بدون مقدمه بریم یکم پایتون بخونیم 😁.
35 |
36 | ### تاریخچه
37 |
38 | زمینه یادگیری عمیق هر چیزی شناخت تاریخچه و اهداف و علت های ساخت اون چیزه
39 |
40 | پایتون که امروز به یه زبان همه منظوره و مفسری شناخته میشه که اولین بار در سال 1991 عرضه شد
41 | نویسنده پایتون گیدو ون راسوم (Guido van Rossum) است که متولد 1956 و اهل هلند است
42 |
43 | ### علت نام گذاری پایتون
44 |
45 | نام زبان برنامهنویسی پایتون از علاقه نویسنده آن به کمدین
46 | بریتانیایی معروف، مونتی پایتون (Monty Python)، گرفته شده است.
47 | گویدو ون راسوم، نویسنده این زبان برنامهنویسی، به خاطر علاقه خود به
48 | این برنامه تلویزیونی کمدی و همچنین برای جذب توجه ویژهای به این زبان،
49 | از نام "پایتون" برای نامگذاری این زبان استفاده کرد.
50 |
51 | ### محبوبت و قدمت
52 |
53 | بر خلاف نظر اکثریت که فکر می کنند پایتون زبان جدیدیه، پایتون یه زبان نسبتا قدیمی حساب میشه
54 | علت این افکار عموما به این بر میگرده که پایتون توی سال های اخیر تازه بر سر زبان ها افتاده و تونسته جای خودش رو در صدر جدول برای چند سالی نگه داره
55 |
56 | برای مثال جاوااسکریپت (JavaScript) سال 1995 عرضه شد 5 سال بعد از پایتون
57 |
58 | روبی(Ruby) هم سال 1995 عرضه شد
59 |
60 | سی شارپ(C#) سال 2001 عرضه شد
61 |
62 | جولیا(Julia) سال 2012 عرضه شد
63 |
64 | گو(Go) سال 2009 عرضه شد
65 |
66 | ### چرا پایتون؟
67 |
68 | عموما پایتون زبانی سطح بالا با سینتکس راحت و خوانا نزدیک به زبان انسان است برای همین می تونه گزینه خوبه برای شروع برنامه نویسی باشه
69 | و همچنین با توجه به محبوبیت و رشد پایتون و همچنین پکیج های زیادی که داره میتونه یه انتخاب مناسب برای شروع و کار در فیلد های مختلف باشه
70 |
71 | ---
72 |
73 | ### چرا اینهمه زبان برنامه نویسی داریم ؟
74 |
75 | زبان های برنامه نویسی مثل ابزار های مختلف برای ساخت یک خونه میمونن مثل انبر ، چکش ، اره ، بیل ، کلنگ. هر کدوم از اینا برای کاری ساخته شدن ، مثلا با چکش نمیشه چاله کند.
76 |
77 | به عنوان مثال زبان پایتون یک زبان با سرعت پایین هستش و High level. ما میخوایم برای سخت افزارمون برنامه نویسی بکنیم و سرعت برنامه سخت افزاری ما باید زیاد باشه . ما نمیتونیم از زبانی مثل پایتون که به سخت افزار نزدیک نیست و توی این مورد سرعت پایینی داره استفاده بکنیم پس میایم از زبان اسمبلی یا سی استفاده میکنیم.
78 |
79 | زبان پایتون یک زبونیه که بهره وری رو بالاتر میبره به دلیل راحتی در کد و نزدیک بودن به زبان انگلیسی سرعت توسعه رو خیلی بالا میره.
80 |
81 | به طور خلاصه هر زبونی رو بهر کاری ساختن و هر زبونی توی یک سری کارها بهتر از بقیه زبون هاست.
82 |
83 | ---
84 |
85 | > accountability = مسئولیت
86 | > instructions = دستور عمل
87 | > gibberish = بیهودگی
88 | >
89 | > > valuable = hard to acquire
90 |
91 | ### نکته : همیشه بالای مطلبی معانی زبانی هستن که نوشتم ، این معانی خیلی توی دنیای کامپیوتر استفاده میشن پس به دردتون میخوره .
92 |
93 | ---
94 |
95 | زبان ماشین به صورت اعداد باینری (0 و 1) و یا بیت ها نوشته میشود. زبانی هست که فقط کامپیوتر (مدار های کامپیوتر) میفهمه و میتونه برنامه های مارو اجرا بکنه. و زبان های برنامه نویسی که ما باهاشون کار میکنیم و جوری طراحی شدن که برای ما قابل فهمه مثل زبان های برنامه نویسی پایتون ، جاوااسکریپت ، پایتون ، گولنگ ....
96 | زبان های میانی بین زبان ماشین و زبان انسان هستن . به خاطر همینه که ما راحت به حروف انگلیسی میتونیم برنامه های مختلف بسازیم وگرنه پوستمون کنده میشد.
97 |
98 | **زبان های Low level** : زبان هایی هستن که به زبان ماشین نزدیک تر هستند مثل c , c++ , assembly ... .
99 |
100 | **زبان های High Level** : زبان هایی که به زبان انسان نزدیک تر هستند ، مثل : python , JavaScipt ....
101 |
102 | #### به طور خلاصه :
103 |
104 | زبان سطح بالا به زبان هایی گفته میشه که به زبان ما انسان ها نزدیکه و درکش برای ما اسون و در عوض برای کامپیوتر سخته ولی زبان های سطح پایین برعکس برای ما سخت ولی برای کامپیوتر اسونه!
105 |
106 | ---
107 |
108 |
109 |
110 | **Translator:** وظیفه مترجم اینه که زبان برنامه نویسی که ما باهاش کد میزنیم رو به زبان ماشین ترجمه بکنه ، به عنوان مثال ما داریم پایتون کد میزنیم و به پایتون میگیم که یه متنی رو برای من چاپ بگیر ، کامپیوتر نمیفهمه که من توی زبان پایتون چی نوشتم ، میگه که این چرتو پرت چیه تحویل من میدی ، اینجاست که مترجم ها وارد کار میشن و و اون چرت و پرت رو برای کامپیوتر به زبان ماشین ترجمه میکنن و کامپیوتر حالا میگه که اها داداش تو میخوای واست یه متنیه چاپ بگیرم ، بیا اینم متنت .
111 |
112 | #### انواع Translator ها :
113 |
114 | 1. compiler
115 |
116 | کار کامپایلر به این صورت هستش که میاد کد های مارو از اول و تا آخر میخونه اگر مشکلی ، اروری چیزی نداشت میاد کد مارو تبدیل به فایل اجرایی میکنه مثلا فایل .exe ، و هر سری برای اجرای این برنامه نیاز نیستش از اول این کد کامپایل بشه و دوبارخ فایل اجرایی جدید برای اجرا ساخته بشه ولی تا زمانی که بخواید توی کدتون تغیری ایجاد کنید ، اونموق دوباره نیازه که کدتون کامپایل بشه و خب سرعت زبان های کامپایلری از زبان های interpreter یا همون مفسری بیشتر . به عنوان مثال زبان های : C++ , C# , Java زبان های کامپایلری هستند.
117 |
118 | 1. interpreter
119 |
120 | مفسر میاد خط به خط کدامون رو میخونه و اگر اون خط مشکلی نداشت خروجی همونو بهمون میده و مفسر هیچ فایل اجرایی نداره چون کامپایل نمیشه و داره ترجمه میشه پس در نتیجه برای هربار اجرا باید این روند رو طی بکنه و همین موضوع سرعتش رو پایین میره !. زبان مفسری مثل : python , PHP , JavaScript , Ruby.
121 |
122 | ---
123 |
124 | ### برنامه نویسی به صورت انلاین
125 |
126 | شما برای برنامه نویسی به صورت انلاین ( فقط برای یاگیری ) میتونید از
127 | وبسایت های زیر استفاده کنید:
128 |
129 | - [Glot.io](https://glot.io)
130 | - [Repl.it](https://repl.it)
131 |
132 | ---
133 |
134 | ```py
135 | print(’hello world’)
136 | ```
137 |
138 | این دستور توی پایتون برای ما هر چی که بخوایم رو در درون ترمینال برای ما خروجی میگیره. این ساده ترین دستور درون پایتونه . به طور تخصصی به این اینا میگن سینتکس و این سینتکس ها از قبل درون زبان برنامه نویسی پایتون قرار داده شدند.
139 |
140 | ---
141 |
142 | ### نحوه تفسیر شدن کد پایتونی به زبان ماشین
143 |
144 |
145 |
146 | اول از همه ما کدی رو که توی پایتون مینویسم مثل همین `print('hello world')`
147 | ، این به مفسر پایتون داده میشه
148 | و بعدش اون مفسری که از قبل براش نوشتن ، میاد کد مارو به بایت کد ترجمه میکنه و اون بایت کد درون ماشین مجازی زبان سی به نام cpython قرار میگیره
149 | و اون ماشین مجازی ، بایت کد مارو به زبان ماشین تبدیل میکنه :) .
150 |
151 | ---
152 |
153 | ```py
154 |
155 | input('Whats your name ?')
156 |
157 | ```
158 |
159 | این تابع یا فعلا بهتره از لفظ تابع استفاده نکنیم ، چون زوده یکم ، بهتره بگیم این کد ، کارش اینه که میاد از ما ورودی دریافت میکنه ، از کجا ؟
160 | خب از ترمینال ما ، همونجایی که ما کد پایتونیمون رو خروجی میگیریم.
161 | به مثال زیر دقت کنید:
162 |
163 |
164 |
165 | اگه دقت کنید میتونید ببینید ، از ما پرسیده که اسمت چیه ؟ خب من جواب دادم علیرضا. ولی این اسم نه جایی ذخیره شده نه حرکتی زده شده مثلا بیاد بگه سلام علیرضا.
166 |
167 | باید چیکار بکنیم ؟ اینو توی یک متفیر ذخیره بکنیم ، وقتی چیزی رو توی متفیر ذخیره میکنیم این توی مموریما میره و ذخیره میشه و ما میتونیم با این کار های مختلف بکنیم.
168 |
169 | ```py
170 |
171 | userName = input('whats your name ? ')
172 |
173 | print('Hello ' + userName)
174 |
175 | ```
176 |
177 |
178 |
179 | و حالا میبینید که ما تونستیم از این تابع input استفاده بکنیم ، یک ورودی از کاربر دریافت بکنیم و اون ورودی رو درون متغیر بریزیم و از اون متغیر به عنوان خروجی استفاده بکنیم .
180 |
181 | ---
182 |
183 | # Python.3 vs Python.2
184 |
185 | > evolving = درحال تکامل | decided = تصمیم گرفت | legacy = میراث
186 |
187 | ### breaking changes :
188 |
189 | به اپدیتی گفته میشه که وقتی میاد دیگه اپلیکیشن ها برنامه ها و پروژه ها نمیتونن از اون اپدیت استفاده بکنن چون اصلا براشون طراحی نشده. به عنوان مثال وقتی پایتون 3 اومد دیگه شرکت ها نمیتونستن خودشونو تا مدت ها اپدیت بکنن و باید خط به خط پروژه هاشونو اپدیت میکردن. یعنی همه چی برای شرکتا ف\*\*اکداپ شده بود 😂.
190 |
191 | از سال 2008 سازنده پایتون تصمیم گرفت که ورژن جدید پایتون رو بسازه یعنی ورژن 3 که انقلابی در کامیونیتی پایتون بودش و اینکه اومد کلا تمامی زیرساخت های زبان پایتون رو از نو کوبید و ساخت باعث breaking changes شد.
192 |
193 | ### نمونه ای از کد های پایتون 2 و 3 :
194 |
195 | ```py
196 | #python 2 :
197 | print ‘hello world’
198 |
199 | #python 3 :
200 | print(’hello world’)
201 |
202 | ```
203 |
204 | ---
205 |
206 |