Skip to content

3. مبانی پایتون

Image

3.1. اسکریپت [bases_01]: عملیات پایه‌ای

اسکریپت [bases_01] ویژگی‌های پایه‌ای پایتون را معرفی می‌کند.


# ----------------------------------
def affiche(chaine):
    #یک رشته را نمایش می‌دهد
    print("chaine=%s" % chaine)


# ----------------------------------
def affiche_type(variable):
    # نوع متغیر را نمایش می‌دهد
    print("type[%s]=%s" % (variable, type(variable)))


# ----------------------------------
def f1(param):
    #مقدار پارامتر را ۱۰ افزایش می‌دهد
    return param + 10


# ----------------------------------
def f2():
    # یک تپل از ۳ مقدار را بازمی‌گرداند
    return "un", 0, 100


# -------------------------------- برنامه اصلی ------------------------------------
# این یک نظر است
# متغیر بدون اعلام شدن استفاده شده
nom = "dupont"

# یک نمایش صفحه
print("nom=%s" % nom)

# یک لیست حاوی عناصری با انواع مختلف
liste = ["un", "deux", 3, 4]

# تعداد عناصر آن
n = len(liste)

#یک حلقه
for i in range(n):
    print("liste[%d]=%s" % (i, liste[i]))

# ابتدایی‌سازی دو متغیر با یک تپل
(chaine1, chaine2) = ("chaine1", "chaine2")

#الحاق دو رشته
chaine3 = chaine1 + chaine2

# نمایش نتیجه
print("[%s,%s,%s]" % (chaine1, chaine2, chaine3))

# استفاده از یک تابع
affiche(chaine1)

#نوع یک متغیر ممکن است مشخص باشد
affiche_type(n)
affiche_type(chaine1)
affiche_type(liste)

#نوع یک متغیر ممکن است در زمان اجرا تغییر کند
n = "a changé"
affiche_type(n)

#یک تابع ممکن است نتیجه‌ای را بازگرداند
res1 = f1(4)
print("res1=%s" % res1)

#یک تابع ممکن است یک لیست از مقادیر را بازگرداند
(res1, res2, res3) = f2()
print("(res1,res2,res3)=[%s,%s,%s]" % (res1, res2, res3))

#این مقادیر می‌توانستند در یک متغیر ذخیره شده باشند
liste = f2()
for i in range(len(liste)):
    print("liste[%s]=%s" % (i, liste[i]))

# آزمون‌ها
for i in range(len(liste)):
    # فقط رشته‌ها را نمایش می‌دهد
    if type(liste[i]) == "str":
        print("liste[%s]=%s" % (i, liste[i]))

# آزمایش‌های بیشتر
for i in range(len(liste)):
    # فقط اعداد صحیح بزرگ‌تر از ۱۰ را نمایش می‌دهد
    if type(liste[i]) == "int" and liste[i] > 10:
        print("liste[%s]=%s" % (i, liste[i]))

#یک حلقه while
liste = (8, 5, 0, -2, 3, 4)
i = 0
somme = 0
while i < len(liste) and liste[i] > 0:
    print("liste[%s]=%s" % (i, liste[i]))
    somme += liste[i]  #sum = sum + list[i]
    i += 1  #i = i + 1
print("somme=%s" % somme)
#پایان برنامه

توضیحات

  • خط ۲: کلمه کلیدی def یک تابع را تعریف می‌کند؛
  • خط ۲: تابع پارامتر [chaine] را دریافت می‌کند. نوع پارامتر مشخص نشده است. پایتون منحصراً از ارسال به صورت مقدار استفاده می‌کند. این موضوع بسته به نوع داده متفاوت است:
    • برای یک نوع ساده (عدد، بولین و غیره)، این مقدار همان ارزشی است که در داده‌ها نهفته است (4، True و غیره)؛
    • برای یک نوع پیچیده (لیست، کلاس و غیره)، این مقدار، نشانی حافظه داده‌ها است؛
  • خطوط ۳–۴: بدنه تابع. این بخش با یک تب به سمت راست جابجا شده است. این جابجایی، در ترکیب با کاراکتر «:» در دستور def، بدنه تابع را تعریف می‌کند. این موضوع برای تمام دستورات دارای بدنه صدق می‌کند: if، else، while، for، try، except؛
  • خط ۴: نحوی که در اینجا استفاده شده [print('text1%F1text2%F2…' % data1, data2)] است:
    • [%Fi] (در اینجا %s) قالب‌های نمایش هستند:
    • %s (رشته‌ای): برای یک رشتهٔ کاراکتری؛
    • %d (ممیزدار): برای اعداد صحیح ممیزدار علامت‌دار؛
    • %f (ممیز شناور): فرمت اعشاری برای اعداد حقیقی؛
    • %e (نمایش نمایی): قالب نمایی برای یک عدد حقیقی؛
  • [data1, data2…] عبارت‌هایی هستند که می‌خواهیم مقادیرشان را نمایش دهیم:
    • [data1] به صورت F1 نمایش داده خواهد شد؛
    • [data2] در قالب F2 نمایش داده خواهد شد؛
  • خط ۱۰: پایتون به‌طور داخلی انواع متغیرها را مدیریت می‌کند. شما می‌توانید با استفاده از تابع type(variable) نوع یک متغیر را مشخص کنید، که یک متغیر از نوع 'type' را بازمی‌گرداند. عبارت '%s' % (type(variable)) یک رشته است که نوع متغیر را نشان می‌دهد؛
  • خط ۲۵: برنامه اصلی. این معمولاً (اما نه لزوماً) پس از تعریف تمام توابع اسکریپت قرار می‌گیرد. محتوای آن با فاصله شروع نمی‌شود؛
  • خط ۲۸: در پایتون، متغیرها اعلام نمی‌شوند. پایتون به حروف بزرگ و کوچک حساس است. متغیر Nom با متغیر nom متفاوت است. یک رشته می‌تواند در گیومه دوبل " یا گیومه تکی ' قرار گیرد. بنابراین می‌توانید بنویسید 'dupont' یا "dupont";
  • خط ۳۴: بین یک تپل (1,2,3) (توجه کنید به پرانتزهای گرد) و یک لیست [1,2,3] (توجه کنید به کروشه‌ها) تفاوت وجود دارد. یک تپل (tuple) غیرقابل تغییر است، در حالی که یک لیست قابل تغییر است. در هر دو مورد، عدد i که نشان‌دهنده عنصر است با [i] نشان داده می‌شود؛
  • خط ۴۰: range(n) تپل (0,1,2,…,n-1) است؛
  • خط ۴۱: قالب %d برای اعداد صحیح علامت‌دار استفاده می‌شود؛
  • خط ۷۴: len(var) تعداد عناصر در مجموعه var (تُپل، لیست، دیکشنری و غیره) است؛
  • خط ۸۴: ساختار [for in …] به شما امکان می‌دهد بر روی یک ساختار قابل ایتراسیون (iterable) ایتراسیون کنید. لیست‌ها و تپل‌ها عناصر قابل ایتراسیون هستند؛
  • خط ۸۶: سایر عملگرهای بولی or و not هستند؛
  • خط ۹۳: جمع اعداد بزرگتر از ۰ در لیست؛

خروجی به این صورت است:


C:\Data\st-2020\dev\python\cours-2020\python3-flask-2020\venv\Scripts\python.exe C:/Data/st-2020/dev/python/cours-2020/python3-flask-2020/bases/bases_01.py
nom=dupont
liste[0]=un
liste[1]=deux
liste[2]=3
liste[3]=4
[chaine1,chaine2,chaine1chaine2]
chaine=chaine1
type[4]=<class 'int'>
type[chaine1]=<class 'str'>
type[['un', 'deux', 3, 4]]=<class 'list'>
type[a changé]=<class 'str'>
res1=14
(res1,res2,res3)=[un,0,100]
liste[0]=un
liste[1]=0
liste[2]=100
liste[0]=8
liste[1]=5
somme=13

Process finished with exit code 0

3.2. اسکریپت [bases_02]: رشته‌های قالب‌بندی‌شده

پایتون ۳ روش جدیدی برای قالب‌بندی رشته‌ها معرفی کرد:


#قالب‌بندی رشته‌ها
# فرمت‌ها متعلق به زبان C هستند
# عددی
int1 = 10
print(f"[int1={int1}]")
print(f"[int1={int1:4d}]")
print(f"[int1={int1:04d}]")
# ممیز شناور
float1=8.2
print(f"[float1={float1}]")
print(f"[float1={float1:8.2f}]")
print(f"[float1={float1:.3e}]")
# رشته
str1="abcd"
print(f"[str1={str1}]")
print(f"[str1={str1:8s}]")
str2="jean de florette"
print(f"[{str2:20.10s}]")
#رشته‌های قالب‌بندی‌شده را می‌توان به متغیرها اختصاص داد
str3=f"[{str2:20.10s}]"
print(str3)

سینتکس رشتهٔ قالب‌بندی‌شده به شرح زیر است:

f'…{expr1:format1} …. {expr2:format2} ….'

که در آن:

  • [expri]: یک عبارت؛
  • [formati]: قالب عبارت [expri]. این قالب‌ها از زبان C هستند:
    • %d: برای اعداد صحیح؛
    • %f: نمایش اعشاری برای اعداد حقیقی؛
    • %e: نمایش نمایی برای اعداد حقیقی؛
    • %s: برای رشته‌های کاراکتری. این فرمت زمانی استفاده می‌شود که هیچ فرمت برای [expri] مشخص نشده باشد؛
    • %nd، %nf، %ns: نمایش [expri] در n کاراکتر: رشته یا کوتاه می‌شود یا با فاصله‌ها پُر می‌شود؛
  • خط ۷: [04d]، یک عدد صحیح ۴ کاراکتری که از سمت چپ با صفر پر شده است؛
  • خط ۱۱: [8.2f]، یک عدد حقیقی اعشاری ۸ کاراکتری، شامل ۲ کاراکتر پس از ممیز؛
  • خط ۱۲: [.3e]، یک عدد حقیقی در شکل نمایی با ۳ رقم اعشاری برای مانتیسا؛
  • خط ۱۸: [20.10s]، ۱۰ کاراکتر اول یک رشته که با فاصله‌ها پد شده تا ۲۰ کاراکتر شود؛

نتایج اجرای برنامه به شرح زیر است:

C:\Data\st-2020\dev\python\cours-2020\python3-flask-2020\venv\Scripts\python.exe C:/Data/st-2020/dev/python/cours-2020/python3-flask-2020/bases/bases_02.py
[int1=10]
[int1=  10]
[int1=0010]
[float1=8.2]
[float1=    8.20]
[float1=8.200e+00]
[str1=abcd]
[str1=abcd    ]
[jean de fl          ]
[jean de fl          ]

Process finished with exit code 0

3.3. اسکریپت [bases_03]: تبدیل انواع

در اینجا به تبدیل‌های نوع مربوط به داده‌های از نوع str (رشته کاراکتری)، int (پوئنتی)، float (اعداد اعشاری) و bool (بولین) می‌پردازیم.


#تبدیل انواع
# int → str, float, bool
x = 4
print(x, type(x))
x = str(4)
print(x, type(x))
x = float(4)
print(x, type(x))
x = bool(4)
print(x, type(x))

# bool → int, float, str
x = True
print(x, type(x))
x = int(True)
print(x, type(x))
x = float(True)
print(x, type(x))
x = str(True)
print(x, type(x))

# str → int, float, bool
x = "4"
print(x, type(x))
x = int("4")
print(x, type(x))
x = float("4")
print(x, type(x))
x = bool("4")
print(x, type(x))

# float → str, int, bool
x = 4.32
print(x, type(x))
x = str(4.32)
print(x, type(x))
x = int(4.32)
print(x, type(x))
x = bool(4.32)
print(x, type(x))

# مدیریت خطاهای تبدیل نوع
try:
    x = int("abc")
    print(x, type(x))
except ValueError as erreur:
    print(erreur)

# موارد متفرقه
x = bool("abc")
print(x, type(x))
x = bool("")
print(x, type(x))
x = bool(0)
print(x, type(x))
x = None
print(x, type(x))
x = bool(None)
print(x, type(x))
x = bool(0.0)
print(x, type(x))

#تمام داده‌ها نمونه‌های کلاس هستند و بنابراین متد دارند
# رشتهٔ کاراکتری
str1 = "abc"
print(str1.capitalize())
# صحيح
int1 = 4
print(int1.bit_length())
# بولین
bool1=True
print(bool1.conjugate())
# عدد ممیز شناور
float1=8.2
print (float1.is_integer())

تبدیل‌های نوع زیادی ممکن است. برخی ممکن است شکست بخورند، مانند موارد در خطوط ۴۶–۴۷ که تلاش می‌کنند رشته 'abc' را به یک عدد صحیح تبدیل کنند. ما این خطا را با استفاده از ساختاری به نام try / except مدیریت کرده‌ایم. یک شکل کلی از این ساختار

به شرح زیر است:


try:
    actions
except Exception as ex:
    actions
finally:
    actions

اگر هر یک از عملیات‌های درون بلوک try استثنا (سیگنال خطا) پرتاب کنند، کنترل بلافاصله به بند **except می‌پردازد. اگر عملیات‌های درون بلوک try استثنا پرتاب نکنند، بند except** نادیده گرفته می‌شود. ویژگی‌های Exception و ex از دستور except اختیاری هستند. وقتی وجود داشته باشد، Exception نوع استثنایی را که توسط دستور except مهار شده است مشخص می‌کند، و ex حاوی استثنایی است که رخ داده است. ممکن است چندین دستور except وجود داشته باشد اگر بخواهید انواع مختلف استثناها را در همان try مدیریت کنید.

دستور finally اختیاری است. اگر این دستور وجود داشته باشد، عملیات در finally همیشه اجرا می‌شوند، صرف‌نظر از اینکه آیا استثنایی رخ داده است یا خیر.

ما کمی بعد به موضوع استثناها باز خواهیم گشت.

خطوط ۴۹ تا ۶۱ تلاش‌های مختلفی را برای تبدیل داده‌های نوع str، int، float و NoneType به مقادیر بولی نشان می‌دهند. این کار همیشه امکان‌پذیر است. قوانین به شرح زیر است:

  • bool(int i) در صورتی که i برابر 0 باشد، False و در سایر موارد True است؛
  • bool(float f) مقدار False را در صورتی که f برابر 0.0 باشد برمی‌گرداند، و در سایر موارد مقدار True را برمی‌گرداند؛
  • bool(str string) مقدار False را در صورتی که رشته دارای 0 کاراکتر باشد برمی‌گرداند، و مقدار True را در سایر موارد؛
  • bool(None) مقدار False را برمی‌گرداند. None یک مقدار ویژه است که به معنای وجود متغیر اما بدون مقدار بودن آن است.

خروجی صفحه به شرح زیر است:

C:\Data\st-2020\dev\python\cours-2020\python3-flask-2020\venv\Scripts\python.exe C:/Data/st-2020/dev/python/cours-2020/python3-flask-2020/bases/bases_03.py
4 <class 'int'>
4 <class 'str'>
4.0 <class 'float'>
True <class 'bool'>
True <class 'bool'>
1 <class 'int'>
1.0 <class 'float'>
True <class 'str'>
4 <class 'str'>
4 <class 'int'>
4.0 <class 'float'>
True <class 'bool'>
4.32 <class 'float'>
4.32 <class 'str'>
4 <class 'int'>
True <class 'bool'>
invalid literal for int() with base 10: 'abc'
True <class 'bool'>
False <class 'bool'>
False <class 'bool'>
None <class 'NoneType'>
False <class 'bool'>
False <class 'bool'>
Abc
3
1
False

Process finished with exit code 0

توجه داشته باشید که تمام داده‌ها اشیاء هستند، یعنی نمونه‌های کلاس. این بدان معناست که آن‌ها ممکن است متد داشته باشند. این موضوع در خطوط ۶۳ تا ۷۵ کد نشان داده شده است. هدف ما در اینجا توضیح عملکرد متدهای استفاده شده نیست، بلکه صرفاً نشان دادن وجود آن‌هاست.

3.4. اسکریپت [bases_04]: دامنه متغیرها

اسکریپت [bases_04] نشان می‌دهد که پایتون مفهوم متغیرهای محدود به بلوک را ندارد:


# دامنه متغیر
i = 4
if True:
    i += 1
    j = 7
print(f"i={i}, j={j}")

نتایج

1
2
3
4
C:\Data\st-2020\dev\python\cours-2020\python3-flask-2020\venv\Scripts\python.exe C:/Data/st-2020/dev/python/cours-2020/python3-flask-2020/bases/bases_04.py
i=5, j=7

Process finished with exit code 0

نظرات

نتایج دو چیز را نشان می‌دهد:

  • خط ۴: متغیر [i] در بلوک [if] همان متغیر i است که در خط ۲ استفاده شده است؛
  • خط ۶: متغیر [j] همان متغیری است که در بلوک [if] مقداردهی اولیه شده است؛

در برخی زبان‌ها، جایی که متغیرها اعلام می‌شوند، متغیری که درون یک بلوک تعریف شده (مانند موارد در خطوط ۳–۵) در خارج از آن بلوک قابل دسترسی نیست. در پایتون، این موضوع صادق نیست.

3.5. اسکریپت [bases_05]: لیست‌ها – ۱

اسکریپت [bases_05] به شرح زیر است:


# لیست‌های یک‌بعدی
# ابتکاری
list1 = [0, 1, 2, 3, 4, 5]

# تکرار - ۱
print(f"list1 a {len(list1)} éléments")
for i in range(len(list1)):
    print(f"list1[{i}]={list1[i]}")

list1[1] = 10
# تکرار – ۲
print(f"list1 a {len(list1)} éléments")
for element in list1:
    print(element)

# افزودن دو عنصر
list1[len(list1):] = [10, 11]
# قالب %s فهرست را در یک خط نمایش می‌دهد
print("%s" % list1)

# حذف دو مورد آخر
list1[len(list1) - 2:] = []
# قالب پیش‌فرض لیست را در یک خط نمایش می‌دهد
print(f"{list1}")

# افزودن یک لیست در ابتدای لیست
list1[:0] = [-10, -11, -12]
print(f"{list1}")

#دو مورد را در وسط لیست درج می‌کند
list1[3:3] = [100, 101]
print(f"{list1}")

#حذف دو آیتم از وسط لیست
list1[3:4] = []
print(f"{list1}")

یادداشت‌ها:

  • نشانه‌گذاری array[i:j] به عناصر i تا j-1 آرایه اشاره دارد؛
  • علامت [i:] نشان‌دهنده عناصر از i به بعد در آرایه است؛
  • علامت [:i] به عناصر 0 تا i-1 آرایه اشاره دارد؛
  • خط ۱۹: دستور print (%s) % (list1) رشته زیر را نمایش می‌دهد: «[ list1[0], list1[2]…, list1[n-1]]»;
  • خط ۲۴: notation print ('f{list1}') همین کار را انجام می‌دهد؛

نتایج


C:\Data\st-2020\dev\python\cours-2020\python3-flask-2020\venv\Scripts\python.exe C:/Data/st-2020/dev/python/cours-2020/python3-flask-2020/bases/bases_05.py
list1 a 6 éléments
list1[0]=0
list1[1]=1
list1[2]=2
list1[3]=3
list1[4]=4
list1[5]=5
list1 a 6 éléments
0
10
2
3
4
5
[0, 10, 2, 3, 4, 5, 10, 11]
[0, 10, 2, 3, 4, 5]
[-10, -11, -12, 0, 10, 2, 3, 4, 5]
[-10, -11, -12, 100, 101, 0, 10, 2, 3, 4, 5]
[-10, -11, -12, 101, 0, 10, 2, 3, 4, 5]

Process finished with exit code 0

3.6. اسکریپت [bases_06]: لیست‌ها - ۲

کد قبلی را می‌توان به روش دیگری (bases_06) با استفاده از برخی متدهای لیست نوشت:


# فهرست‌های یک‌بعدی

# ابتدایی‌سازی
list1 = [0, 1, 2, 3, 4, 5]

# تکرار - ۱
print(f"list1 a {len(list1)} éléments")
for i in range(len(list1)):
    print(f"list1[{i}]={list1[i]}")

# تغییر یک عنصر
list1[1] = 10

# تکرار – ۲
print(f"list1 a {len(list1)} éléments")
for element in list1:
    print(element)

# افزودن دو عنصر
list1.extend([10, 11])
print(f"{list1}")

# حذف دو عنصر آخر
del list1[len(list1) - 2:]
print(f"{list1}")

# افزودن یک تپل به ابتدای لیست
for i in (-12, -11, -10):
    list1.insert(0, i)
print(f"{list1}")

# افزودن در وسط لیست
for i in (101, 100):
    list1.insert(3, i)
print(f"{list1}")

# حذف یک عنصر از وسط لیست
del list1[3:4]
print(f"{list1}")

نتایج به‌دست‌آمده با نسخه قبلی یکسان است.

3.7. اسکریپت [bases_07]: دیکشنری

اسکریپت [bases_07] نشان می‌دهد چگونه یک دیکشنری را تعریف و استفاده کنیم، که گاهی به آن آرایهٔ asociative گفته می‌شود.


# تابعی که بررسی می‌کند آیا کلید 'husband' در دیکشنری 'spouses' وجود دارد یا خیر
def existe(conjoints, mari):
    if mari in conjoints:
        print(f"La clé [{mari}] existe associée à la valeur [{conjoints[mari]}]")
    else:
        print(f"La clé [{mari}] n'existe pas")


# ----------------------------- اصلی
# یک فرهنگ لغت
conjoints = {"Pierre": "Gisèle", "Paul": "Virginie", "Jacques": "Lucette", "Jean": ""}

# تکرار - ۱
print(f"Nombre d'éléments du dictionnaire : {len(conjoints)}")
for (clé, valeur) in conjoints.items():
    print(f"conjoints[{clé}]={valeur}")

# فهرست کلیدهای دیکشنری
print("liste des clés-------------")
clés = conjoints.keys()
print(f"{clés}")

# فهرست مقادیر فرهنگ لغت
print("liste des valeurs------------")
valeurs = conjoints.values()
print(f"{valeurs}")

# جستجو برای یک کلید
existe(conjoints, "Jacques")
existe(conjoints, "Lucette")
existe(conjoints, "Jean")

# حذف یک جفت کلید-مقدار
del (conjoints["Jean"])
print(f"Nombre d'éléments du dictionnaire : {len(conjoints)}")
print(f"{conjoints}")

#کلیدها و مقادیر دیکشنری لیست نیستند
print(f"type des clés : {type(clés)}")
print(f"type des valeurs : {type(valeurs)}")

# می‌توان آن‌ها را به لیست‌ها تبدیل کرد
lclés = list(clés)
print(f"clés : {type(lclés)}, {lclés}")
lvaleurs = list(valeurs)
print(f"valeurs : {type(lvaleurs)}, {lvaleurs}")

یادداشت‌ها:

  • خط ۱۱: تعریف سخت‌کدشده یک دیکشنری؛
  • خط ۱۵: conjoints.items() لیست جفت‌های (کلید، مقدار) را در دیکشنری به صورت آرایهٔ انجمنی درمی‌آورد؛
  • خط ۲۰: conjoints.keys() کلیدهای آرایهٔ asociative را برمی‌گرداند؛
  • خط ۲۵: conjoints.values() مقادیر دیکشنری 'conjoints' را برمی‌گرداند؛
  • خط ۳: مقدار کلید 'husband' در دیکشنری 'spouses'، اگر کلید mari در دیکشنری conjoints وجود داشته باشد، مقدار True را برمی‌گرداند، در غیر این صورت مقدار False را برمی‌گرداند؛
  • خط ۳۶: یک دیکشنری می‌تواند در یک خط نمایش داده شود.

نتایج


C:\Data\st-2020\dev\python\cours-2020\python3-flask-2020\venv\Scripts\python.exe C:/Data/st-2020/dev/python/cours-2020/python3-flask-2020/bases/bases_07.py
Nombre d'éléments du dictionnaire : 4
conjoints[Pierre]=Gisèle
conjoints[Paul]=Virginie
conjoints[Jacques]=Lucette
conjoints[Jean]=
liste des clés-------------
dict_keys(['Pierre', 'Paul', 'Jacques', 'Jean'])
liste des valeurs------------
dict_values(['Gisèle', 'Virginie', 'Lucette', ''])
La clé [Jacques] existe associée à la valeur [Lucette]
La clé [Lucette] n'existe pas
La clé [Jean] existe associée à la valeur []
Nombre d'éléments du dictionnaire : 3
{'Pierre': 'Gisèle', 'Paul': 'Virginie', 'Jacques': 'Lucette'}
type des clés : <class 'dict_keys'>
type des valeurs : <class 'dict_values'>
clés : <class 'list'>, ['Pierre', 'Paul', 'Jacques']
valeurs : <class 'list'>, ['Gisèle', 'Virginie', 'Lucette']

Process finished with exit code 0

یادداشت‌ها:

  • توجه کنید که در خطوط ۱۶–۱۷ نتایج، کلیدها و مقادیر یک دیکشنری یک لیست را تشکیل نمی‌دهند، بلکه یک نوع به نام «dict_keys» هستند؛
  • خطوط ۱۸–۱۹: یک تغییر ساده در نوع به آن‌ها اجازه می‌دهد تا به نوع '[list]' تبدیل شوند؛

3.8. اسکریپت [bases_08]: تِیوپ‌ها

یک تِپل مشابه یک لیست است اما تغییرناپذیر است:


# تُپل‌ها
# ابتدایی‌سازی
tuple1 = (0, 1, 2, 3, 4, 5)

# تکرار - 1
print(f"tuple1 a {len(tuple1)} elements")
for i in range(len(tuple1)):
    print(f"tuple1[{i}]={tuple1[i]}")

# تکرار - ۲
print(f"tuple1 a {len(tuple1)} elements")
for element in tuple1:
    print(element)

#یک تپل می‌تواند در یک خط نمایش داده شود
print(f"tuple1={tuple1}")

#یک تپل قابل تغییر نیست
tuple1[0] = 10

نتایج


C:\Data\st-2020\dev\python\cours-2020\python3-flask-2020\venv\Scripts\python.exe C:/Data/st-2020/dev/python/cours-2020/python3-flask-2020/bases/bases_08.py
tuple1 a 6 elements
tuple1[0]=0
tuple1[1]=1
tuple1[2]=2
tuple1[3]=3
tuple1[4]=4
tuple1[5]=5
tuple1 a 6 elements
0
1
2
3
4
5
tuple1=(0, 1, 2, 3, 4, 5)
Traceback (most recent call last):
  File "C:/Data/st-2020/dev/python/cours-2020/python3-flask-2020/bases/bases_08.py", line 19, in <module>
    tuple1[0] = 10
TypeError: 'tuple' object does not support item assignment

Process finished with exit code 1

یادداشت‌ها:

  • خطوط ۱۷–۲۰ نتایج نشان می‌دهند که یک تپل قابل تغییر نیست.

3.9. اسکریپت [bases_09]: لیست‌ها و دیکشنری‌های چندبعدی

اسکریپت [bases_09] نشان می‌دهد چگونه یک لیست یا دیکشنری چندبعدی را تعریف و استفاده کنیم:


# فهرست‌های چندبعدی
# ابتدایی‌سازی
multi = [[0, 1, 2], [10, 11, 12, 13], [20, 21, 22, 23, 24]]

# تکرار
for i1 in range(len(multi)):
    for i2 in range(len(multi[i1])):
        print(f"multi[{i1}][{i2}]={multi[i1][i2]}")

# نمایش در یک خط
print(f"multi={multi}")

# واژه‌نامه‌های چندبعدی
# ابتدایی‌سازی
multi = {"zéro": [0, 1], "un": [10, 11, 12, 13], "deux": [20, 21, 22, 23, 24]}

# گشت‌وگذار
for (clé, valeur) in multi.items():
    for i2 in range(len(valeur)):
        print(f"multi[{clé}][{i2}]={multi[clé][i2]}")

# نمایش تک‌خطی
print(f"multi={multi}")

توضیحات

  • خط ۷: multi[i1] یک لیست است؛
  • خط ۱۸: 'value' یک لیست است؛

نتایج


C:\Data\st-2020\dev\python\cours-2020\python3-flask-2020\venv\Scripts\python.exe C:/Data/st-2020/dev/python/cours-2020/python3-flask-2020/bases/bases_09.py
multi[0][0]=0
multi[0][1]=1
multi[0][2]=2
multi[1][0]=10
multi[1][1]=11
multi[1][2]=12
multi[1][3]=13
multi[2][0]=20
multi[2][1]=21
multi[2][2]=22
multi[2][3]=23
multi[2][4]=24
multi=[[0, 1, 2], [10, 11, 12, 13], [20, 21, 22, 23, 24]]
multi[zéro][0]=0
multi[zéro][1]=1
multi[un][0]=10
multi[un][1]=11
multi[un][2]=12
multi[un][3]=13
multi[deux][0]=20
multi[deux][1]=21
multi[deux][2]=22
multi[deux][3]=23
multi[deux][4]=24
multi={'zéro': [0, 1], 'un': [10, 11, 12, 13], 'deux': [20, 21, 22, 23, 24]}

Process finished with exit code 0

3.10. اسکریپت [bases_10]: پیوند بین رشته‌ها و فهرست‌ها

اسکریپت [bases_10] نشان می‌دهد چگونه در یک لیست، عناصر یک رشته را که با یک جداکنندهٔ واحد از هم جدا شده‌اند، بازیابی کنیم.


# تبدیل رشته به لیست
chaine = '1:2:3:4'
liste = chaine.split(':')
print(type(liste))

#نمایش لیست
print(f"liste a {len(liste)} éléments")
print(f"liste={liste}")

# فهرست به رشته
chaine2 = ":".join(liste)
print(f"chaine2={chaine2}")

#بیایید یک فیلد خالی اضافه کنیم
chaine += ":"
print(f"chaine={chaine}")
liste = chaine.split(":")

#نمایش لیست
print(f"liste a {len(liste)} éléments")
print(f"liste={liste}")

#بیایید یک فیلد خالی دیگر اضافه کنیم
chaine += ":"
print(f"chaine={chaine}")
liste = chaine.split(":")

#نمایش لیست
print(f"liste a {len(liste)} éléments")
print(f"liste={liste}")

یادداشت‌ها:

  • خط ۳: متد chaine.split(separator) رشته chaine را به عناصری که توسط séparateur از هم جدا شده‌اند تقسیم می‌کند و آن‌ها را به صورت یک لیست بازمی‌گرداند. بنابراین، عبارت '1:2:3:4'.split(":") به لیست ('1','2','3','4'); ارزیابی می‌شود.
  • خط ۱۱: &#x27;separator&#x27;.join(list) رشته &#x27;list[0]+separator+list[1]+separator+…&#x27; را بازمی‌گرداند.

نتایج


C:\Data\st-2020\dev\python\cours-2020\python3-flask-2020\venv\Scripts\python.exe C:/Data/st-2020/dev/python/cours-2020/python3-flask-2020/bases/bases_10.py
<class 'list'>
liste a 4 éléments
liste=['1', '2', '3', '4']
chaine2=1:2:3:4
chaine=1:2:3:4:
liste a 5 éléments
liste=['1', '2', '3', '4', '']
chaine=1:2:3:4::
liste a 6 éléments
liste=['1', '2', '3', '4', '', '']

Process finished with exit code 0

3.11. اسکریپت [bases_11]: عبارات باقاعده

اسکریپت [bases_11] نشان می‌دهد چگونه از عبارت‌های منظم استفاده کنیم:


# ماژول عبارت‌های منظم را وارد کنید
import re


# --------------------------------------------------------------------------
def compare(modèle, chaine):
    #رشته [chaîne] را با الگوی [modèle] مقایسه می‌کند
    #نتایج را نمایش می‌دهد
    print(f"\nRésultats({chaine},{modèle})")
    match = re.match(modèle, chaine)
    if match:
        print(match.groups())
    else:
        print(f"La chaîne [{chaine}] ne correspond pas au modèle [{modèle}]")


# بیان‌های منظم در پایتون
#استخراج فیلدهای مختلف از یک رشته
#الگو: دنباله‌ای از ارقام که توسط هر کاراکتری احاطه شده باشد
# ما فقط می‌خواهیم دنباله ارقام را استخراج کنیم
modèle = r"^.*?(\d+).*?$"

# ما رشته را با الگو مطابقت می‌دهیم
compare(modèle, "xyz1234abcd")
compare(modèle, "12 34")
compare(modèle, "abcd")

#الگو: دنباله‌ای از اعداد که توسط هر کاراکتری احاطه شده است
# ما می‌خواهیم دنبالهٔ ارقام و همچنین فیلدهای بلافاصله قبل و بعد از آن را
modèle = r"^(.*?)(\d+)(.*?)$"

# ما رشته را با الگو مطابقت می‌دهیم
compare(modèle, "xyz1234abcd")
compare(modèle, "12 34")
compare(modèle, "abcd")

#الگو – یک تاریخ در قالب dd/mm/yy
modèle = r"^\s*(\d\d)\/(\d\d)\/(\d\d)\s*$"
compare(modèle, "10/05/97")
compare(modèle, " 04/04/01 ")
compare(modèle, "5/1/01")

#الگو – یک عدد اعشاری
modèle = r"^\s*([+-]?)\s*(\d+\.\d*|\.\d+|\d+)\s*$"
compare(modèle, "187.8")
compare(modèle, "-0.6")
compare(modèle, "4")
compare(modèle, ".6")
compare(modèle, "4.")
compare(modèle, " + 4")
#پایان

یادداشت‌ها:

  • به ماژول [re] که در خط ۲ وارد شده است توجه کنید. این ماژول شامل توابع مربوط به کار با عبارت‌های منظم است؛
  • خط ۱۰: مقایسه یک رشته با یک عبارت منظم (الگو) مقدار بولی True را در صورتی که رشته با الگو مطابقت داشته باشد برمی‌گرداند، و در غیر این صورت مقدار False را برمی‌گرداند؛
  • خط ۱۲: match.groups() یک تِپل است که عناصر آن بخش‌های رشته‌ای هستند که با عناصر عبارت منظم محصور در پرانتز مطابقت دارند. در الگو:
    • ^.*?(\d+).*?، match.groups() یک تِپل با یک عنصر خواهد بود زیرا یک پرانتز وجود دارد؛
    • ^(.*?)(\d+)(.*?)$، match.groups() یک تِیوپ با سه عنصر خواهد بود زیرا سه جفت پرانتز وجود دارد؛
  • خط ۲۱: یک عبارت منظم صریح به صورت r"xxx" نوشته می‌شود. این نماد r است که رشته را به یک عبارت منظم تبدیل می‌کند؛

بیان‌های منظم به ما امکان می‌دهند قالب یک رشته را بررسی کنیم. برای مثال، می‌توانیم تأیید کنیم که یک رشته نمایانگر یک تاریخ در قالب dd/mm/yy است. برای این کار، از یک الگو استفاده می‌کنیم و رشته را با آن الگو مقایسه می‌کنیم. در این مثال، d، m و y باید اعداد باشند. بنابراین الگو برای یک فرمت تاریخ معتبر "\d\d/\d\d/\d\d" است، که در آن نماد \d نشان‌دهنده یک رقم است. نمادهایی که می‌توان در یک الگو استفاده کرد به شرح زیر است:

کاراکتر
توضیحات
\
نشان می‌دهد که کاراکتر بعدی یک کاراکتر ویژه یا یک کاراکتر واقعی است. برای مثال، «n» با کاراکتر «n» مطابقت دارد، در حالی که «\n» با کاراکتر خط جدید مطابقت دارد. توالی «\\» با «\» مطابقت دارد، در حالی که «\("» با «(» مطابقت دارد.
^
مطابقت دارد با شروع رشته.
دلار
مطابقت با انتهای رشته.
*
با کاراکتر قبلی مطابقت دارد، صفر یا چند بار. بنابراین، «zo*» با «z» یا «zoo» مطابقت دارد.
+
با کاراکتر قبلی یک یا چند بار مطابقت دارد. برای مثال، «zo+» با «zoo» مطابقت دارد، اما با «z» مطابقت ندارد.
؟
با کاراکتر قبلی صفر یا یک بار مطابقت دارد. برای مثال، «a?ve?» با «ve» در «lever» مطابقت دارد.
.
هر کاراکتر منفردی را مطابقت می‌دهد، به جز کاراکتر خط جدید.
(الگو)
به دنبال modèle می‌گردد و تطابق را ذخیره می‌کند. زیر رشته‌ی تطابق‌یافته را می‌توان از مجموعه match.groups() بازیابی کرد. برای یافتن تطابق‌هایی که شامل کاراکترها در پرانتز ( ) هستند، از "\(" یا "\)" استفاده کنید.
x|y
مطابقت می‌دهد با x یا y. برای مثال، "z|foot" مطابقت می‌دهد با "z" یا "foot". "(z|f)oo" مطابقت می‌دهد با "zoo" یا "foo".
{n}
n یک عدد صحیح غیرمنفی است. دقیقاً به همان تعداد n با کاراکتر مطابقت دارد. برای مثال، «o{2}» با «o» در «Bob» مطابقت ندارد، اما با دو «o» اول در «fooooot» مطابقت دارد.
{n,}
n یک عدد صحیح غیرمنفی است. این عبارت حداقل n بار با کاراکتر مطابقت دارد. به عنوان مثال، «o{2,}» با «o» در «Bob» مطابقت ندارد، اما با تمام «o»ها در «fooooot» مطابقت دارد. «o{1,}» معادل «o+» و «o{0,}» معادل «o*» است.
{n,m}
m و n اعداد صحیح غیرمنفی هستند. حداقل n و حداکثر m بار از این کاراکتر مطابقت داده می‌شود. برای مثال، «o{1,3}» با سه «o» اول در «foooooot» مطابقت دارد و «o{0,1}» معادل «o؟» است.
[xyz]
مجموعه کاراکتر. مطابقت می‌دهد با یکی از کاراکترهای مشخص‌شده. برای مثال، «[abc]» با «a» در «plat» مطابقت دارد.
[^xyz]
مجموعه کاراکتر منفی. با هر کاراکتری که در لیست ذکر نشده مطابقت دارد. برای مثال، «[^abc]» با «p» در «plat» مطابقت دارد.
[a-z]
محدوده کاراکتری. با هر کاراکتری که در محدوده مشخص شده باشد مطابقت دارد. برای مثال، "[a-z]" با هر حرف کوچک الفبایی بین "a" و "z" مطابقت دارد.
[^m-z]
محدوده کاراکتری منفی. با هر کاراکتری مطابقت دارد که در توالی مشخص‌شده یافت نشود. برای مثال، "[^m-z]" با هر کاراکتری که بین "m" و "z" یافت نشود مطابقت دارد.
\b
مطابقت می‌دهد با مرز کلمه، یعنی موقعیت بین یک کلمه و یک فاصله. برای مثال، "er\b" با "er" در "lever" مطابقت دارد، اما با "er" در "verbe" مطابقت ندارد.
\B
یک مرز را مطابقت می‌دهد که نمایانگر یک کلمه نیست. «en*t\B» با «ent» در «bien entendu» مطابقت دارد.
\d
با یک کاراکتر نمایانگر یک رقم مطابقت دارد. معادل [0-9] است.
\D
مطابقت می‌دهد با یک کاراکتر که عدد نیست. معادل [^0-9].
\f
نماینده کاراکتر فرستنده فرم است.
\n
نشان‌دهنده کاراکتر خط جدید است.
\r
معادل کاراکتر بازگشت به خانه.
\s
هرگونه فضای خالی، از جمله فاصله، تب، پایان صفحه و غیره را مطابقت می‌دهد. معادل "[ \f\n\r\t\v]".
\S
هر کاراکتر غیرفاصله‌ای را مطابقت می‌دهد. معادل "[^ \f\n\r\t\v]".
\t
با کاراکتر تب مطابقت دارد.
\v
با کاراکتر تب عمودی مطابقت دارد.
\w
هر کاراکتری را که نمایانگر یک کلمه باشد و شامل یک خط تیره باشد، مطابقت می‌دهد. معادل «[A-Za-z0-9_]».
\W
هر کاراکتری را که نمایانگر یک کلمه نیست مطابقت می‌دهد. معادل "[^A-Za-z0-9_]".
\num
با num مطابقت دارد، که در آن num یک عدد صحیح مثبت است. به تطابق‌های ذخیره‌شده اشاره می‌کند. برای مثال، «(.)\1» با دو کاراکتر متوالی یکسان مطابقت دارد.
\n
مطابقت دارد با n، که در آن n یک مقدار فرار اکتال است. مقادیر فرار اکتال باید شامل ۱، ۲ یا ۳ رقم باشند. به عنوان مثال، "\11" و "\011" هر دو به یک کاراکتر تب (tab) مطابقت دارند. "\0011" معادل "\001" و "1" است. مقادیر فرار اکتال نباید از ۲۵۶ تجاوز کنند. اگر این اتفاق بیفتد، تنها دو رقم اول در عبارت در نظر گرفته می‌شوند. امکان استفاده از کدهای ASCII در عبارات منظم را فراهم می‌کند.
\xn
مطابق با n است، که در آن n یک مقدار فرار هگزادسیمال است. مقادیر فرار هگزادسیمال باید از دو رقم تشکیل شوند. به عنوان مثال، «\x41» معادل «A» است. «\x041» معادل «\x04» و «1» است. امکان استفاده از کدهای ASCII در عبارت‌های منظم را فراهم می‌کند.

یک عنصر در یک الگو ممکن است یک یا چند بار ظاهر شود. بیایید به چند مثال مربوط به نماد \d که نماینده یک رقم است، نگاهی بیندازیم:

الگو
به معنای
\d
یک رقم
\d؟
۰ یا ۱ رقم
*اعداد*
صفر یا بیشتر رقم
اعداد مثبت یک یا بیشتر
۱ یا چند رقم
\d{2}
۲ رقم
\d{3,}
حداقل ۳ رقم
\d{5,7}
بین ۵ تا ۷ رقم

اکنون بیایید الگویی را در نظر بگیریم که قادر به توصیف قالب مورد انتظار برای یک رشته باشد:

رشته مقصد
الگو
یک تاریخ به فرمت dd/mm/yy
\d{2}/\d{2}/\d{2}
یک زمان در قالب ساعت:دقیقه:ثانیه
\d{2}:\d{2}:\d{2}
یک عدد صحیح بدون علامت
\d+
یک دنباله از فاصله، که ممکن است خالی باشد
\s*
یک عدد صحیح بدون علامت که ممکن است قبل یا بعد از آن فاصله‌ها قرار داشته باشد
\s*\d+\s*
یک عدد صحیح که ممکن است علامت‌دار باشد و قبل یا بعد از آن فاصله‌ها قرار گیرند
\s*[+|-]?\s*\d+\s*
یک عدد حقیقی بدون علامت که ممکن است قبل یا بعد از آن فضا باشد
\s*\d+(.\d*)?\s*
یک عدد حقیقی که ممکن است علامت‌دار باشد و قبل یا بعد از آن فاصله‌ها قرار گیرند
\s*[+-]?\s*\d+(.\d*)?\s*
یک رشته حاوی کلمه 'just'
\bجوست\b

می‌توانید مشخص کنید که الگو را در کجای رشته جستجو کنید:

الگو
به معنی
^pattern
الگو در ابتدای رشته آغاز می‌شود
pattern$
الگو رشته را پایان می‌دهد
^الگو$
الگو رشته را شروع و پایان می‌دهد
الگو
الگو در هر جای رشته، از ابتدا جستجو می‌شود.
مورد جستجو
الگو
یک رشته که با علامت تعجب به پایان می‌رسد
!$
یک رشته که با نقطه پایان می‌یابد
\.$
یک رشته که با توالی // آغاز می‌شود
^//
یک رشته متشکل از یک کلمه واحد، که اختیاریاً قبل یا بعد از آن فاصله‌ها قرار می‌گیرند
^\s*\w+\s*$
یک رشته متشکل از دو کلمه، که اختیاریاً می‌تواند قبل یا بعد از آن فضاها قرار گیرند
^\s*\w+\s*\w+\s*$
یک رشته حاوی کلمه 'secret'
\bsecret\b

زیرالگوها در یک الگو را می‌توان «استخراج» کرد. این بدان معناست که نه تنها می‌توانیم بررسی کنیم آیا یک رشته با الگوی خاصی مطابقت دارد، بلکه می‌توانیم عناصر متناظر با زیرالگوهای الگو را که در کروشه‌ها قرار گرفته‌اند از آن رشته استخراج کنیم. برای مثال، اگر در حال تحلیل رشته‌ای هستیم که تاریخ را به فرمت dd/mm/yy در خود دارد و همچنین می‌خواهیم عناصر dd، mm و yy را از آن تاریخ استخراج کنیم، از الگوی (\d\d)/(\d\d)/(\d\d) استفاده می‌کنیم.

نتایج اسکریپت


C:\Data\st-2020\dev\python\cours-2020\python3-flask-2020\venv\Scripts\python.exe C:/Data/st-2020/dev/python/cours-2020/python3-flask-2020/bases/bases_11.py

Résultats(xyz1234abcd,^.*?(\d+).*?$)
('1234',)

Résultats(12 34,^.*?(\d+).*?$)
('12',)

Résultats(abcd,^.*?(\d+).*?$)
La chaîne [abcd] ne correspond pas au modèle [^.*?(\d+).*?$]

Résultats(xyz1234abcd,^(.*?)(\d+)(.*?)$)
('xyz', '1234', 'abcd')

Résultats(12 34,^(.*?)(\d+)(.*?)$)
('', '12', ' 34')

Résultats(abcd,^(.*?)(\d+)(.*?)$)
La chaîne [abcd] ne correspond pas au modèle [^(.*?)(\d+)(.*?)$]

Résultats(10/05/97,^\s*(\d\d)\/(\d\d)\/(\d\d)\s*$)
('10', '05', '97')

Résultats( 04/04/01 ,^\s*(\d\d)\/(\d\d)\/(\d\d)\s*$)
('04', '04', '01')

Résultats(5/1/01,^\s*(\d\d)\/(\d\d)\/(\d\d)\s*$)
La chaîne [5/1/01] ne correspond pas au modèle [^\s*(\d\d)\/(\d\d)\/(\d\d)\s*$]

Résultats(187.8,^\s*([+-]?)\s*(\d+\.\d*|\.\d+|\d+)\s*$)
('', '187.8')

Résultats(-0.6,^\s*([+-]?)\s*(\d+\.\d*|\.\d+|\d+)\s*$)
('-', '0.6')

Résultats(4,^\s*([+-]?)\s*(\d+\.\d*|\.\d+|\d+)\s*$)
('', '4')

Résultats(.6,^\s*([+-]?)\s*(\d+\.\d*|\.\d+|\d+)\s*$)
('', '.6')

Résultats(4.,^\s*([+-]?)\s*(\d+\.\d*|\.\d+|\d+)\s*$)
('', '4.')

Résultats( + 4,^\s*([+-]?)\s*(\d+\.\d*|\.\d+|\d+)\s*$)
('+', '4')

Process finished with exit code 0