متغیر و نوع داده
متغیر یعنی اسمی برای یک مقدار؛ چهار نوع پایهی str و int و float و bool، دیدن نوع با type، تبدیل با int و str و float، کار با متن (چسباندن، f-string، upper، split، replace، اندیس و برش)، مقایسه و and/or/not، و خطاهای TypeError و ValueError.
- حدود ۱۸ دقیقه مطالعه
- ۸ مثال اجراشده
- ۳ تمرین با جواب
- مقدماتی تا متوسط
- بهروزرسانی: ۲۹ مهر ۱۴۰۵
توی این درس یاد میگیری مقدارها را در متغیر نگه داری و با آنها کار کنی. چهار نوع دادهی پایهی پایتون را میشناسی: متن (str)، عدد صحیح (int)، عدد اعشاری (float) و درست/غلط (bool). میبینی چرا "5" + 3 خطا میدهد و چطور با int() و str() نوع را عوض کنی، و یاد میگیری متن را بچسبانی، با f-string قالببندی کنی، بشکنی و تکهاش را برداری. در آخر با مقایسه (==، <) و ترکیب شرطها (and، or، not) آمادهی درس شرط میشوی.
مسئله: کامپیوتر باید چیزها را «به خاطر بسپارد»
Section titled “مسئله: کامپیوتر باید چیزها را «به خاطر بسپارد»”در درس قبل input اسم کاربر را گرفت و در name گذاشت. بدون آن، جواب کاربر همان لحظه گم میشد. هر برنامهی واقعی پر از مقدارهایی است که باید نگه داشته شوند و تغییر کنند: موجودی حساب، تعداد خطاها، اسم فایل بعدی. و کامپیوتر باید بداند هر مقدار چه نوعی است: «۵» را باید جمع بزند یا مثل یک کلمه کنار بقیه بگذارد؟
تشبیه: برچسب روی جعبه
Section titled “تشبیه: برچسب روی جعبه”متغیر مثل یک برچسب است که روی یک جعبه میچسبانی. جعبه (مقدار) چیزی را نگه میدارد و برچسب (اسم) راه پیدا کردنش است. age = 30 یعنی «جعبهای با عدد ۳۰ بساز و برچسب age را رویش بزن». بعداً میتوانی برچسب را بکنی و روی جعبهی دیگری بزنی (age = 31). نوع هم مثل جنس جعبه است: جعبهی شیشهای مایع نگه میدارد و جعبهی مقوایی کاغذ؛ نمیشود هر کاری را با هر جعبهای کرد.
مثالهای عملی
Section titled “مثالهای عملی”همهی فایلها را در ~/py بساز (cd ~/py). یک خطها را هم میتوانی در حالت تعاملی (python3) امتحان کنی.
مثال ۱: اولین متغیرها و type
Section titled “مثال ۱: اولین متغیرها و type”name = "علی"age = 30height = 1.78is_student = Falseprint(name, age, height, is_student)print(type(name), type(age), type(height), type(is_student))age = age + 1print("سال بعد:", age)علی 30 1.78 False<class 'str'> <class 'int'> <class 'float'> <class 'bool'>سال بعد: 31=یعنی «مقدار سمت راست را در اسم سمت چپ بگذار». این برابری ریاضی نیست:age = age + 1یعنی «مقدار فعلی age بهاضافهی یک را حساب کن و دوباره در age بگذار».type(x)نوع مقدار را میگوید.
| نوع | اسم کامل | نمونه | برای |
|---|---|---|---|
str |
string (رشته) | "علی"، 'hello'، "123" |
متن (هر چیزی داخل کوتیشن) |
int |
integer (عدد صحیح) | 30، -5، 0 |
شمردن، شماره |
float |
عدد اعشاری | 1.78، 3.0، -0.5 |
اندازه، قیمت اعشاری |
bool |
boolean (منطقی) | True، False |
بله/خیر، روشن/خاموش |
دقت کن True و False با حرف اول بزرگ و بدون کوتیشناند، و "123" (با کوتیشن) متن است، نه عدد.
قاعدهی اسمگذاری: حرف انگلیسی، عدد و _؛ با عدد شروع نشود؛ فاصله نداشته باشد. رسم پایتون: حروف کوچک و _ بین کلمهها (user_name، total_price). اسمها حساس به حروف بزرگ و کوچکاند: Age و age دو متغیر جدا هستند.
مثال ۲: متن و عدد با هم جمع نمیشوند
Section titled “مثال ۲: متن و عدد با هم جمع نمیشوند”x = "5"print(x + 3)Traceback (most recent call last): File "/home/ali/py/mix.py", line 2, in <module> print(x + 3) ~~^~~TypeError: can only concatenate str (not "int") to strTypeError یعنی «این کار با این نوع ممکن نیست». + روی دو متن یعنی چسباندن و روی دو عدد یعنی جمع؛ روی یک متن و یک عدد، پایتون حدس نمیزند منظورت کدام است و خطا میدهد. (این سختگیری خوب است: جلوی باگ «۲۹۱» را میگیرد.)
مثال ۳: تبدیل نوع
Section titled “مثال ۳: تبدیل نوع”برای اینکه خودت بگویی منظورت چیست، نوع را تبدیل کن:
x = "5"y = 3print(int(x) + y)print(x + str(y))print(float("2.5") * 2)print(int(3.99))print(round(3.567, 2))print(bool(0), bool(1), bool(""), bool("سلام"))8535.033.57False True False True| تابع | کار | نکته |
|---|---|---|
int(x) |
به عدد صحیح | int(3.99) اعشار را دور میریزد (۳)، گرد نمیکند |
float(x) |
به عدد اعشاری | float("2.5") |
str(x) |
به متن | برای چسباندن عدد به متن |
round(x, n) |
گرد کردن تا n رقم اعشار | round(3.567, 2) میشود 3.57 |
bool(x) |
به درست/غلط | 0، "" (متن خالی) و None غلطاند؛ بقیه درست |
خروجی print("2" + "2") چیست؟
جواب درست: 22
هر دو متناند، پس + آنها را به هم میچسباند. برای جمع: int("2") + int("2")
مثال ۴: input همیشه متن برمیگرداند
Section titled “مثال ۴: input همیشه متن برمیگرداند”age = input("سنت چند است؟ ")print(type(age))print("سال بعد:", int(age) + 1)سنت چند است؟ 29<class 'str'>سال بعد: 30حتی وقتی کاربر عدد تایپ میکند، input آن را متن (str) برمیگرداند؛ برای همین int(age) لازم است. یک نکتهی جالب: int() پایتون عدد فارسی را هم میفهمد؛ اگر کاربر ۲۹ بنویسد هم جواب 30 میشود (برخلاف ترمینال که عدد فارسی را نمیشناخت). ولی اگر چیزی بنویسد که اصلاً عدد نیست:
سنت چند است؟ بیست<class 'str'>Traceback (most recent call last): File "/home/ali/py/age.py", line 3, in <module> print("سال بعد:", int(age) + 1) ^^^^^^^^ValueError: invalid literal for int() with base 10: 'بیست'ValueError یعنی «نوع درست است (متن)، ولی مقدارش را نمیتوانم تبدیل کنم». در درس «خطا و ماژول» یاد میگیری این خطا را بگیری و از کاربر دوباره بپرسی.
مثال ۵: کار با متن
Section titled “مثال ۵: کار با متن”متنها ابزارهای زیادی دارند. اسم را انگلیسی گرفتهایم تا بزرگ و کوچک کردن حروف دیده شود:
first = "Ali"last = "Rezaei"full = first + " " + lastprint(full)print(full.upper(), full.lower())print(len(full))print(full[0], full[-1], full[0:3])print(" trim me ".strip() + "|")print("a,b,c".split(","))print("Rezaei".replace("e", "E"))print("Ali" in full, "Sara" in full)Ali RezaeiALI REZAEI ali rezaei10A i Alitrim me|['a', 'b', 'c']REzaEiTrue False| کد | کار |
|---|---|
a + b |
چسباندن دو متن (فاصله را خودت بگذار) |
s.upper() / s.lower() |
همهی حروف بزرگ / کوچک |
len(s) |
تعداد حرفها (فاصله هم یک حرف است) |
s[0] / s[-1] |
حرف اول / آخر (شمارهها از صفر شروع میشوند) |
s[0:3] |
برش: از شمارهی ۰ تا قبل از ۳ |
s.strip() |
حذف فاصلههای اول و آخر |
s.split(",") |
شکستن به یک لیست (درس لیستها) |
s.replace(a, b) |
جایگزینی همهی aها با b |
"x" in s |
آیا x داخل s هست؟ (True/False) |
نقطهی بعد از اسم متغیر (full.upper()) یعنی «کاری که مخصوص این نوع است». اینها متد (method) نام دارند. نکتهی مهم: متدها متن اصلی را عوض نمیکنند؛ یک متن جدید برمیگردانند. اگر میخواهی نگهش داری: full = full.upper().
مثال ۶: f-string، تمیزترین راه ساختن متن
Section titled “مثال ۶: f-string، تمیزترین راه ساختن متن”چسباندن با + و str() زود شلوغ میشود. f-string (یک f قبل از کوتیشن) اجازه میدهد متغیرها را مستقیم داخل { } بگذاری:
first = "Ali"print(f"اسم: {first}، طول اسم: {len(first)}")price = 125000print(f"قیمت: {price:,} تومان")print(f"{10/3:.2f}")اسم: Ali، طول اسم: 3قیمت: 125,000 تومان3.33داخل { } هر عبارت پایتونی میآید. بعد از : میشود قالب داد: :, جداکنندهی هزارگان و :.2f دو رقم اعشار. از این به بعد در دوره تقریباً همیشه از f-string استفاده میکنیم.
مثال ۷: مقایسه و منطق
Section titled “مثال ۷: مقایسه و منطق”مقایسه همیشه True یا False برمیگرداند:
print(5 == 5, 5 != 3, 3 < 2, "a" < "b")print(True and False, True or False, not True)age = 20print(age >= 18 and age < 65)print(0.1 + 0.2)print(0.1 + 0.2 == 0.3)print(round(0.1 + 0.2, 2) == 0.3)True True False TrueFalse True FalseTrue0.30000000000000004FalseTrue==(دو مساوی) یعنی «برابر است؟» و=(یک مساوی) یعنی «بگذار». قاطی کردنشان اشتباه شمارهی یک است.!=نابرابر؛<،>،<=،>=مثل ریاضی. متنها به ترتیب الفبا مقایسه میشوند.and: هر دو درست؛or: دستکم یکی درست؛not: برعکس.- عددهای اعشاری دقیق نیستند:
0.1 + 0.2دقیقاً0.3نمیشود (پشت پرده). برای مقایسهشان اول گرد کن، و برای پول از عدد صحیح (مثلاً ریال) استفاده کن.
مثال ۸: میانبرهای تغییر مقدار
Section titled “مثال ۸: میانبرهای تغییر مقدار”x = 10x += 5print(x)x *= 2print(x)print(7 % 2, 8 % 2)15301 0x += 5 همان x = x + 5 است (و -=، *=، /= هم هست). % (باقیمانده) برای فهمیدن زوج و فرد عالی است: باقیماندهی تقسیم بر ۲، برای عدد زوج صفر است.
پشت پرده: متغیر در حافظه
Section titled “پشت پرده: متغیر در حافظه”وقتی مینویسی age = 30، پایتون یک شیء (object) عدد ۳۰ در حافظه میسازد و اسم age را به آن وصل میکند. اسم خودش مقدار را در خود ندارد؛ فقط به آن اشاره میکند. برای همین در پایتون نوع مال مقدار است، نه مال اسم: x = 5 و بعد x = "پنج" کاملاً مجاز است (به این میگویند نوعدهی پویا). این انعطاف راحت است، ولی یعنی تو باید حواست باشد هر لحظه در یک متغیر چه نوعی هست؛ type() همیشه دم دستت است.
و چرا 0.1 + 0.2 دقیق نیست؟ کامپیوتر عددها را در مبنای ۲ نگه میدارد (درس «بیت و بایت» در دورهی مبانی). همانطور که 1/3 در مبنای ده یک اعشار بیپایان است (0.333...)، 0.1 در مبنای دو هم بیپایان است و باید جایی بریده شود. این مشکل پایتون نیست؛ تقریباً همهی زبانها همین رفتار را دارند.
جدولهای مرجع
Section titled “جدولهای مرجع”| عملگر | روی عدد | روی متن |
|---|---|---|
+ |
جمع | چسباندن |
* |
ضرب | تکرار ("ha" * 3) |
== != |
برابر / نابرابر | برابر / نابرابر |
< > |
کوچکتر / بزرگتر | ترتیب الفبا |
in |
(نه) | زیرمتن هست؟ |
| خطا | معنی |
|---|---|
TypeError |
این کار با این نوع ممکن نیست (مثلاً متن + عدد) |
ValueError |
نوع درست است ولی مقدار قابلتبدیل نیست (int("بیست")) |
NameError |
متغیر تعریف نشده (یا قبل از تعریف استفاده شده) |
اشتباهات رایج
Section titled “اشتباهات رایج”۱) جمع کردن جواب input بدون تبدیل
Section titled “۱) جمع کردن جواب input بدون تبدیل”input("عدد: ") + 1 خطای TypeError میدهد. راهحل: int(input("عدد: ")) + 1.
۲) = بهجای ==
Section titled “۲) = بهجای ==”if age = 18: (درس بعد) SyntaxError میدهد. راهحل: مقایسه همیشه ==.
۳) فراموش کردن f در f-string
Section titled “۳) فراموش کردن f در f-string”name = "Ali"print("سلام {name}")سلام {name}بدون f، {name} همان متن عادی است. راهحل: print(f"سلام {name}").
۴) فکر کردن اینکه متد متن را عوض میکند
Section titled “۴) فکر کردن اینکه متد متن را عوض میکند”s = "ali"s.upper()print(s)alis.upper() یک متن جدید ساخت که جایی نگه داشته نشد. راهحل: s = s.upper().
۵) شمارهگذاری از یک
Section titled “۵) شمارهگذاری از یک”"Ali"[1] حرف l است، نه A. راهحل: یادت باشد اولین حرف شمارهی صفر است؛ و s[-1] همیشه حرف آخر.
برنامهای بنویس که قیمت یک کالا (عدد صحیح، به تومان) و تعدادش را در دو متغیر بگذارد و با f-string چاپ کند «جمع: ۳۷۵,۰۰۰ تومان» (با جداکنندهی هزارگان).
دیدن جواب
price = 125000count = 3total = price * countprint(f"جمع: {total:,} تومان")جمع: 375,000 تومانتمرین اصلی: یک «ماشینحساب BMI» بنویس. وزن (کیلوگرم) و قد (متر، مثلاً 1.75) را با input بگیر، BMI را با فرمول وزن ÷ (قد × قد) حساب کن و با یک رقم اعشار چاپ کن. یادت باشد جواب input متن است.
دیدن جواب
weight = float(input("وزن (کیلوگرم): "))height = float(input("قد (متر): "))bmi = weight / (height * height)print(f"BMI تو: {bmi:.1f}")وزن (کیلوگرم): 70قد (متر): 1.75BMI تو: 22.9float لازم است چون قد اعشاری است. height ** 2 هم بهجای height * height درست است.
یک ایمیل مثل Ali.Rezaei@Example.COM (با فاصلههای اول و آخر) را تمیز کن: فاصلهها را بردار و همه را کوچک کن. بعد اسم کاربری (قبل از @) و دامنه (بعد از @) را جدا چاپ کن و بگو آیا دامنه با .com تمام میشود یا نه. (راهنما: split("@") یک لیست دوتایی میدهد؛ [0] و [1] اعضایشاند؛ متد endswith هم هست.)
دیدن جواب
raw = " Ali.Rezaei@Example.COM "email = raw.strip().lower()parts = email.split("@")user = parts[0]domain = parts[1]print(f"ایمیل تمیز: {email}")print(f"کاربر: {user}")print(f"دامنه: {domain}")print("دامنهی .com است؟", domain.endswith(".com"))ایمیل تمیز: ali.rezaei@example.comکاربر: ali.rezaeiدامنه: example.comدامنهی .com است؟ Trueمتدها را میشود پشت هم زد (raw.strip().lower()): خروجی اولی، ورودی دومی است.
آزمونک
Section titled “آزمونک”type("123") چه نوعی است؟
جواب درست: str
هر چیزی داخل کوتیشن متن است.
خروجی int(7.9) چیست؟
جواب درست: 7
int اعشار را دور میریزد؛ برای گرد کردن round.
چرا "5" + 3 خطا میدهد؟
جواب درست: متن و عدد را نمیشود با + ترکیب کرد (TypeError)
int("5") + 3 یا "5" + str(3).
خروجی "Python"[0:2] چیست؟
جواب درست: Py
از شمارهی ۰ تا قبل از ۲.
فرق = و == چیست؟
جواب درست: = مقدار میگذارد؛ == برابری را میسنجد
قاطی کردنشان رایجترین اشتباه است.
f"{3.14159:.2f}" چه میدهد؟
جواب درست: 3.14
:.2f یعنی دو رقم اعشار.
جمعبندی
Section titled “جمعبندی”- متغیر اسمی برای یک مقدار است:
x = 5.=یعنی «بگذار»، نه برابری. - چهار نوع پایه:
str(متن)،int(عدد صحیح)،float(اعشاری)،bool(True/False)؛ باtype()ببین. inputهمیشه متن است؛ باint()وfloat()تبدیل کن، باstr()برعکس.- متن:
+چسباندن،len،[i]و[a:b](از صفر)،upper،strip،split،replace،in؛ و f-string برای ساختن متن. - مقایسه با
==،!=،<…؛ ترکیب باand،or،not. اعشاریها دقیق نیستند. TypeError= نوع نامناسب؛ValueError= مقدار نامناسب.
| دستور | کاری که میکند |
|---|---|
x = 5 | ساختن/عوض کردن متغیر |
type(x) | نوع مقدار |
int(s) / float(s) / str(n) | تبدیل نوع |
f"سلام {name}" | متن با متغیر |
f"{n:,}" / f"{x:.2f}" | جداکنندهی هزارگان / دو رقم اعشار |
s.strip().lower() | تمیز کردن متن |
s.split(",") | شکستن متن به لیست |
s[0] / s[-1] / s[0:3] | حرف اول / آخر / برش |
a == b / a != b | برابر / نابرابر |
x += 1 | یکی اضافه کن |