اذهب إلى المحتوى
  • 0

كيفية تمرير قائمة من المدخلات إلى دالة تقبل أكثر من مدخل في بايثون؟

Fahmy Mostafa

السؤال

لدي قائمة تحتوي على أربعة أرقام وأريد أن أقوم بتمرير كل القيم من هذه القائمة إلى دالة تقبل أربعة مدخلات كالتالي:

def echo(a, b, c, d):
	print(a, b, c, d)

myLits = [1, 2, 3, 4]

أريد تمرير محتوى myList إلى دالة echo، في لغات أخرى مثل JavaScript يمكنني أن أستخدم المعامل "..." كالتالي:

echo( ...myList )

كيف أقوم بهذا الأمر في بايثون؟

رابط هذا التعليق
شارك على الشبكات الإجتماعية

Recommended Posts

  • 1

يُسمى هذا العامل عامل التفكيك أو عامل الإنتشار ( Spread Operator ) و هذه بعض الأمثلة التي يُستخدم فيها في جافاسكربت و كيف نستخدمه في بايثون:

عوامل دالة: ( Function Arguments )

جافاسكربت:

function multiply(a, b) {
  return a * b;
}
const numbers = [2, 5];
console.log(multiply(...numbers)); // 10

بايثون:

def multiply(a, b):
    return a * b
numbers = [2, 5]
print(multiply(*numbers)) # 10

تفكيك عناصر مصفوفة في مصفوفة أخرى: ( Array Literals )

جافاسكربت:

const numbers = [1, 2, 3];
const newNumbers = [0, ...numbers, 4]
console.log(newNumbers); // [ 0, 1, 2, 3, 4 ]

بايثون:

numbers = [1, 2, 3]
new_numbers = [0, *numbers, 4]
print(new_numbers) # [0, 1, 2, 3, 4]

تفكيك كائن في كائن آخر: ( Object Literals )

جافاسكربت:

const testObj = { foo: 'bar' };
console.log({ ...testObj, foo2: 'bar2' }); // { foo: 'bar', foo2: 'bar2' }

بايثون:

test_obj = { 'foo': 'bar' }
print({ **test_obj, 'foo2': 'bar2' }) # {'foo': 'bar', 'foo2': 'bar2'}

أسلوب rest parameters الذي يسمح بتمرير عدد غير محدد من العوامل لدالة ما:

جافاسكربت:

function sum(...numbers) {
  let t = 0;
  for(num of numbers)
    t += num;
  return t;   
}

console.log(sum(1, 2, 3, 4, 5)) // 15

بايثون:

def sum(*numbers):
    t = 0;
    for num in numbers:
        t += num;
    return t;
print(sum(1, 2, 3, 4, 5, 6)) # 21
رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0

يمكن استعمال المعامل '*' فهو يقوم بفرد المصفوفة/نشرها وتحويلها لعدد مساوِ من العناصر:

def echo(a, b, c, d):
	print(a, b, c, d)

myLits = [1, 2, 3, 4]

echo(*myLits) # echo(1, 2, 3, 4)
#   ^^^^^

# output
# 1 2 3 4

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0

إذا كان لديك دالة غير معلوم أو غير محدد عدد المُدخلات فيمكنك إستخدام رمز * لقبول عدد متغير من المُدخلات الى الدالة وايضاً يمكنك تمرير قائمة من المدخلات مرةً واحدة بإستخدام رمز * مجدداً وستحصل في داخل الدالة على قائمة من المُدخلات وهذا الكود يبين كيفية ذلك

# تعريف دالة بعدد مُدخلات غير معلوم
def func(*nums):
  	# حلقة تكرار حول قائمة المتغيرات
    for num in nums:
        print(num)
        
# تعريف قائمة من المُدخلات
lst = [1,2,3,4,5]

# تمرير قائمة المُدخلات الى الدالة
func(*lst)

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0

يمكنك ذلك عبر مايسمى بالوسطاء الموضعية أو الاختيارية *args.

def echo(*args):
  for i in args:
  	print(i)
myLits = [1, 2, 3, 4]
echo(myLits)

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

def func(*args):
  # argswill be a tuple containing all values that are passed in
  for i in args:
    print(i)
  func(1, 2, 3)
  # Calling it with 3 arguments
  # Out: 1
  # 2
  # 3
  list_of_arg_values = [1, 2, 3]
  func(*list_of_arg_values) 
  # Calling it with list of values, * expands the list
  # Out: 1
  # 2
  # 3
  func() 
  # Calling it without arguments
  # No Output
  

للتنويه: لايمكنك تمرير عدد افتراضي من الوسطاء، فمثلاً:

(func(*args=[1,  2,  3]) # خطأ

ولايمكن التمرير بالاسم عند استدعاء الدالة:

(func(*args=[1, 2,  3])

ولكن إذا كان لديك بالفعل وسطاء كمصفوفة (أو أي نوع آخر)، تستطيع عندها استدعاء الدالة بالشكل:

func(*my_stuff)

ويمكن الوصول إلى هذه الوسطاء (*args) عن طريق الفهرس، فمثلاُ:

args[0] # ترجع قيمة العنص الأول

يمكنك تمرير مجموعة من الوسطاء العادية والاختيارية لكن يجب التقيد في التعريف، أي الوسطاء العادية أولاً ثم الاختيارية:

def func(p1, p2=10 , *args): #p1 يجب أن نمرر أولاً قيمة ل 
	pass

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...