المتغيرات#

مقدمة#

تُخزّن المتغيرات البيانات وتتيح لك إعادة استخدامها ومعالجتها في جميع أنحاء برنامجك. بايثون لغة ذات كتابة ديناميكية، مما يعني أنك لست بحاجة إلى تحديد نوع المتغير صراحةً. بدلاً من ذلك، يُستنتج النوع تلقائيًا بناءً على القيمة المُسندة إليه. على سبيل المثال:

angle = 90           # angle is an integer
dist = "Distance: "  # dist is a string
steps = 2.5          # steps is a float

لغة بايثون أيضاً لغة ذات كتابة قوية، مما يعني أنه لا يمكنك إجراء عمليات على أنواع غير متوافقة دون تحويلها صراحةً. على سبيل المثال:

red_disks = 2                       # red_disks is an integer
green_disks = "4"                      # green_disks is a string
result = red_disks + green_disks  # Creates a TypeError

لحل هذه المشكلات، يجب عليك تحويل الأنواع بشكل صريح، إذا كان ذلك مناسبًا:

red_disks = 2     # red_disks is an integer
green_disks = "4" # green_disks is a string

# Convert green_disks to an integer before adding
result = int(green_disks) + red_disks

تشرح واجهة برمجة التطبيقات هذه أنواع المتغيرات الشائعة في بايثون. ورغم أنها ليست قائمة شاملة، إلا أنها تغطي الأنواع التي من المرجح أن تستخدمها عمليًا.

  • المتغيرات المحلية – يتم تعريفها داخل دالة ويتم استخدامها فقط ضمن هذا النطاق؛ وهي الأفضل للقيم المؤقتة أو المعزولة.

  • المتغيرات العامة – يتم تعريفها خارج أي دالة ويتم استخدامها في جميع أنحاء المشروع؛ وهي مفيدة لمشاركة البيانات بين الدوال.

  • عدد صحيح – الأعداد الصحيحة المستخدمة للعد أو المسافات أو أي شيء بدون كسور عشرية.

  • Float – الأرقام ذات الفواصل العشرية، وهي مفيدة للقياسات أو العمليات الحسابية الدقيقة.

  • String – قيم نصية، تستخدم للرسائل أو التسميات أو لعرض مخرجات قابلة للقراءة.

  • Boolean – True أو False قيم للمنطق واتخاذ القرار.

  • NoneType – يمثل غياب قيمة في بايثون.

  • Range – يقوم تلقائيًا بإنشاء سلاسل من الأرقام، ويستخدم بشكل شائع في الحلقات.

  • List – مجموعة قابلة للتغيير من العناصر؛ جيدة لتخزين مجموعات من القيم مثل الكائنات أو قراءات المستشعرات.

  • قائمة ثنائية الأبعاد – قائمة من القوائم؛ مثالية لتمثيل الصفوف أو الشبكات أو البيانات الشبيهة بالجداول.

  • Tuple – تسلسل ثابت من القيم لا يمكن تغييره؛ مفيد للبيانات المجمعة وغير المتغيرة.

تعريف متغير وتخصيص قيمة له#

لإنشاء متغير، ما عليك سوى تعيين قيمة لاسم باستخدام عامل التشغيل =:

distance = 100

عند تسمية متغير، يجب الالتزام بالقواعد التالية:

  • لا يمكن أن يحتوي الاسم على أحرف خاصة (مثل علامة التعجب).

  • لا يمكن أن يبدأ الاسم برقم.

  • لا يمكن استخدام المسافات في الاسم.

  • لا يمكن أن يكون الاسم كلمة محجوزة في VEXcode (على سبيل المثال، Drivetrain).

Local Variables#

تُعرَّف المتغيرات المحلية داخل دالة أو كتلة من التعليمات البرمجية. ولا يمكن الوصول إليها إلا ضمن نطاق تلك الدالة أو الكتلة، ولا يمكن رؤيتها خارجها.

def show_local():
    # This variable only exists inside this function
    message = "I'm local!" 
    console.print(message)

def main():
    show_local()

# Start threads — Do not delete
start_thread(main)

تُستخدم المتغيرات المحلية بشكل شائع لتخزين القيم المؤقتة التي تكون ذات صلة فقط داخل وظيفة معينة أو جزء من البرنامج.

Global Variables#

تُعرَّف المتغيرات العامة خارج أي دالة أو كتلة برمجية. ويمكن الوصول إليها وقراءتها في أي مكان في البرنامج، بما في ذلك داخل الدوال.

ملاحظة: يمكن استخدام المتغير العام في أي مكان في مشروعك. قد يكون هذا مفيدًا، ولكنه قد يُصعّب اكتشاف الأخطاء. إذا تغيرت القيمة، فقد تحتاج إلى فحص أجزاء كثيرة من المشروع لمعرفة مكان التغيير. استخدم متغيرًا محليًا عندما تحتاج دالة واحدة فقط إلى القيمة.

# The variable is defined outside a function
message = "I'm global!"  

def show_global():
    # You can access 'message' inside a function
    console.print(message)
    console.new_line()

def main():
    show_global()
    # And you can access 'message' outside a function
    console.print(message)

# Start threads — Do not delete
start_thread(main)

افتراضيًا، يؤدي إسناد قيمة إلى متغير داخل دالة إلى إنشاء متغير محلي. لتعديل متغير عام داخل دالة، يجب عليك تعريفه صراحةً باستخدام الكلمة المفتاحية global.

# Define the global variable
count = 0 

def increase_count():
    # Use the global keyword to let you modify the
    # global variable
    global count
    count = count + 1
    console.print("Count: {}".format(count))

def main():
    increase_count()
    console.new_line()
    increase_count()

# Start threads — Do not delete
start_thread(main)

أنواع البيانات#

يمكن لمتغيرات بايثون تخزين أنواع مختلفة من البيانات، كل منها مناسب لحالات استخدام مختلفة. فيما يلي أكثر الأنواع استخدامًا:

Integer#

العدد الصحيح هو عدد موجب أو سالب.

# Build Used: Super Code Base 2.0
def main():
    distance = 100

    # Move the robot forward for the variable value in mm
    drivetrain.drive_for(FORWARD, distance, MM)

    # Add to the variable and move forward the new value, 
    # for 200mm total
    wait(1, SECONDS)
    distance = distance + 100
    drivetrain.drive_for(FORWARD, distance, MM)

# Start threads — Do not delete
start_thread(main)

Float#

العدد العشري هو عدد يحتوي على فاصلة عشرية.

def main():
    # Store a value with decimal points
    raw_value = 0.88

    # Print the decimal value as a percentage
    console.print(raw_value * 100, "%")

# Start threads — Do not delete
start_thread(main)

String#

السلسلة النصية هي تسلسل من الأحرف، وتستخدم عادة في النصوص.

def main():
    # Set the variable to a string then print the string
    message = "Ready!"
    console.print(message)

# Start threads — Do not delete
start_thread(main)

ملاحظة: يجب دائمًا وضع السلسلة النصية بين علامتي اقتباس متطابقتين، إما مفردة (’) أو مزدوجة (”). يمكنك استخدام أيًّا من النمطين، ولكن يجب أن تتطابق علامتا البداية والنهاية.

Boolean#

يمثل القيمة المنطقية القيم التالية: True أو False.

def main():
    # Set the state of the variable
    delivered = False

    # Print different messages depending on the Boolean.
    if delivered:
        console.print("Package delivered!")
    else: 
        console.print("Delivering...")

# Start threads — Do not delete
start_thread(main)

يمكن تغيير القيم المنطقية في أي مرحلة من مراحل المشروع.

def main():
    # Print the value of the delivered variable
    delivered = True
    console.print(delivered)
    console.new_line()
    wait(2,SECONDS)

    # Clear the screen and print the value of the variable again
    console.clear()
    delivered = False
    console.print(delivered)

# Start threads — Do not delete
start_thread(main)

NoneType#

NoneType يمثل غياب القيمة في بايثون.

def main():
    # No task is assigned yet
    current_task = None

    # Check if a task is assigned
    if current_task is None:
        console.print("No task!")
    else:
        console.print("Task: {}".format(current_task))

# Start threads — Do not delete
start_thread(main)

Range#

النطاق هو سلسلة من الأرقام، ويُستخدم عادةً في الحلقات لتوليد سلاسل رقمية. ويتبع التنسيق التالي:

range(start, stop, step)

عناصر

وصف

start

اختياري. قيمة البداية شاملة (يبدأ التسلسل من هنا). القيمة الافتراضية هي 0.

stop

قيمة التوقف حصرية (يتوقف التسلسل قبل هذا الرقم).

step

اختياري. تحدد هذه الخطوة مقدار الزيادة (أو النقصان) في كل رقم. القيمة الافتراضية هي 1.

# Build Used: Super Code Base 2.0
def main():
    # Drive and turn 4 times to move in a square
    for index in range(4):
        drivetrain.drive_for(FORWARD, 100, MM)
        drivetrain.turn_for(RIGHT, 90)

# Start threads — Do not delete
start_thread(main)

def main():
    # Count by 2 starting at 1 and ending before 12
    for index in range(1, 12, 2): 
        # Print the values on the screen with each loop
        console.print(index)
        console.new_line()

# Start threads — Do not delete
start_thread(main)

List#

تُخزّن القائمة مجموعة من العناصر في متغير واحد. يمكنك إضافة عناصر، أو حذفها، أو تغييرها، أو استخدام كل عنصر على حدة في مشروعك. تُفيد القوائم عندما تريد الاحتفاظ بالقيم المترابطة معًا، مثل قراءات المستشعرات، أو الألوان، أو أسماء الكائنات. تُنشأ القوائم باستخدام الأقواس المربعة [].

def main():
    # Define a list of colors
    colors = ["Red", "Green", "Blue", "Purple"]

    # Repeat for the number of items in the colors list
    for index in colors:
        # Print each color in order
        console.print(index)
        console.new_line()

# Start threads — Do not delete
start_thread(main)

استخدم append لإضافة عناصر إلى قائمة.

def main():
    # Define a list of colors
    colors = ["Red", "Green", "Blue", "Purple"]

    # Append a new color to the list
    colors.append("Yellow")

    # Repeat for the number of items in the colors list
    for index in colors:
        # Print each color in order
        console.print(index)
        console.new_line()

# Start threads — Do not delete
start_thread(main)

2D List#

تُستخدم القائمة ثنائية الأبعاد، أو قائمة القوائم، بشكل شائع لتمثيل الشبكات أو الجداول أو المصفوفات. تمثل كل قائمة فرعية صفًا أو مجموعة محددة من البيانات.

def main():
    # Assign the values in the matrix 2D list
    matrix = [
        ["A", 1, "Red"],
        ["B", 2, "Orange"],
        ["C", 3, "Yellow"]
    ]
    # Loop through each row
    for row in matrix: 
        # Loop through each column in the row 
        for element in row: 
            console.print(element, ", ")
        console.new_line()

# Start threads — Do not delete
start_thread(main)

يمكنك تعديل عناصر محددة أو حتى قوائم فرعية كاملة داخل قائمة ثنائية الأبعاد:

def main():
    # Assign the values in the matrix 2D list
    matrix = [
        ["A", 1, "Red"],
        ["B", 2, "Orange"],
        ["C", 3, "Yellow"]
    ]
    # Modify the color (in column 2) in row 0
    matrix[0][2] = "Blue"

    # Print the modified row from the matrix 2D list 
    console.print(matrix[0])

# Start threads — Do not delete
start_thread(main)

Tuple#

المجموعة المرتبة هي سلسلة من العناصر التي لا يمكن تغييرها بعد إنشائها. وغالبًا ما تُستخدم لتجميع القيم ذات الصلة معًا.

def main():
    # Define a tuple
    set_1 = (100, "Left")

    # Print the tuple
    console.print(set_1)

# Start threads — Do not delete
start_thread(main)

يتم إنشاء المجموعات باستخدام الأقواس () بدلاً من الأقواس المربعة [].