PDA

View Full Version : ارگومان های کلیدی



CyberGhost
دوشنبه 16 تیر 1393, 22:15 عصر
با سلام،میشه لطفا در مورد ارگومان های کلیدی توضیح دهید؟چی هستند و چرا ما در برنامه نویسی از ان ها استفاده می کنیم؟ایا در زیان های برنامه نویسی دیگر به غیر از پایتون هم وجود دارند؟



با تشکر و احترام.

Bahmany
سه شنبه 17 تیر 1393, 11:54 صبح
با سلام
امیدوارم منظورتون Keyword Arguments باشه

توابع می تونن در پایتون ( و یا بیشتر زبون ها ) متغییرهاشون رو بصورت StudentClass = "a" یا keyword = value تعریف کنن
مثلا :

def parrot(voltage, state='a stiff', action='voom', type='Norwegian Blue'):
print "-- This parrot wouldn't", action,
print "if you put", voltage, "Volts through it."
print "-- Lovely plumage, the", type
print "-- It's", state, "!"




تابع بالا به صورت های مختلف زیر قابل فراخونی هست :


parrot(1000)
parrot(action = 'VOOOOOM', voltage = 1000000)
parrot('a thousand', state = 'pushing up the daisies')
parrot('a million', 'bereft of life', 'jump')


و فراخونی های زیر غیر قابل پذیرش هستند :

parrot() # required argument missing
parrot(voltage=5.0, 'dead') # non-keyword argument following keyword
parrot(110, voltage=220) # duplicate value for argument
parrot(actor='John Cleese') # unknown keyword

CyberGhost
سه شنبه 17 تیر 1393, 20:30 عصر
با سلام
امیدوارم منظورتون Keyword Arguments باشه

توابع می تونن در پایتون ( و یا بیشتر زبون ها ) متغییرهاشون رو بصورت StudentClass = "a" یا keyword = value تعریف کنن
مثلا :

def parrot(voltage, state='a stiff', action='voom', type='Norwegian Blue'):
print "-- This parrot wouldn't", action,
print "if you put", voltage, "Volts through it."
print "-- Lovely plumage, the", type
print "-- It's", state, "!"




تابع بالا به صورت های مختلف زیر قابل فراخونی هست :


parrot(1000)
parrot(action = 'VOOOOOM', voltage = 1000000)
parrot('a thousand', state = 'pushing up the daisies')
parrot('a million', 'bereft of life', 'jump')


و فراخونی های زیر غیر قابل پذیرش هستند :

parrot() # required argument missing
parrot(voltage=5.0, 'dead') # non-keyword argument following keyword
parrot(110, voltage=220) # duplicate value for argument
parrot(actor='John Cleese') # unknown keyword


از اینکه وقتتون رو در اختیار گذاشتید و اینقدر با حوصله جواب دادید،تشکر می کنم.بله منظورم همان Keyword Arguments بود،اما سوالی که خیلی ذهنم را درگیر کرده،اینه که چرا ما از این ارگومان های کلیدی در برنامه نویسی استفاده می کنیم؟در ضمن،فرق بین Positional Arguments و Keyword Arguments چیست؟.

با تشکر و احترام.

CyberGhost
پنج شنبه 19 تیر 1393, 13:23 عصر
کسی نبود؟.........

Bahmany
پنج شنبه 19 تیر 1393, 13:31 عصر
positional argument نوعی از آرگیومنت است که بدون مقدار پیش فرض و = تعریف شده است
keyword argument نوعی از آرگیومنت بود که با مقدار پیش فرض تعریف میشد


def rectangleArea(width, height):
return width * height

print rectangleArea(1, 2)
print rectangleArea(width=1, height=2)
print rectangleArea(height=2, width=1)



Positional Argument می تونه با نام مقدار گذاری بشه ، یعنی هر وقت هرجایی تو تابع که دلت خواست می تونی ازش استفاده کنی به این شرط که اسمش کنارش باشه ، مثل مثال بالا

Bahmany
پنج شنبه 19 تیر 1393, 13:36 عصر
حالا این مثال رو توجه بفرما

def func(*args, **kwargs): ----> args: positional kwargs:keyword
res = calc(1, 3, spam="eggs") ----> 1, 3: positional spam="eggs": keyword
به کامنت های روبروش توجه بفرمایید

حالا یه مثال دیگه :



def foo(*positional, **keywords):
print "Positional:", positional
print "Keywords:", keywords


>>> foo('one', 'two', 'three')
Positional: ('one', 'two', 'three')
Keywords: {}

>>> foo(a='one', b='two', c='three')
Positional: ()
Keywords: {'a': 'one', 'c': 'three', 'b': 'two'}

>>> foo('one','two',c='three',d='four')
Positional: ('one', 'two')
Keywords: {'c': 'three', 'd': 'four'}

CyberGhost
جمعه 20 تیر 1393, 23:26 عصر
[QUOTE=Bahmany;2058604]positional argument
keyword argument نوعی از آرگیومنت بود که با مقدار پیش فرض تعریف میشد.

ببخشید اگر اینطور هست،پس Keyword Argument چه فرقی با Default Argument Values داره؟Default Argument Values ها با مقدار پیش فرض در زمان تعریف تابع،معین می شوند.با تشکر از صبر و حوصله شما.

Bahmany
شنبه 21 تیر 1393, 09:18 صبح
[QUOTE=Bahmany;2058604]positional argument
keyword argument نوعی از آرگیومنت بود که با مقدار پیش فرض تعریف میشد.

ببخشید اگر اینطور هست،پس Keyword Argument چه فرقی با Default Argument Values داره؟Default Argument Values ها با مقدار پیش فرض در زمان تعریف تابع،معین می شوند.با تشکر از صبر و حوصله شما.

با سلام
سوال شما نوعی حرکت بین واژه هاست
Default Argument Value یعنی مقدار پیش فرش یک آرگیومنت که ارتباطی با Keyword Argument نداره
پست شماره 6 یه سری مثال خوب داره که دقیقا نقش آرگیومنت ها را مشخص میکنه

CyberGhost
دوشنبه 23 تیر 1393, 15:38 عصر
من معذرت میخوام اما خودم هم گیج شده بودم.پس در واقع ارگومان کلیدی شیوه ای برای فراخوان کردن تابع هست،درست نمی گم؟

Bahmany
دوشنبه 23 تیر 1393, 16:15 عصر
من معذرت میخوام اما خودم هم گیج شده بودم.پس در واقع ارگومان کلیدی شیوه ای برای فراخوان کردن تابع هست،درست نمی گم؟

در واقع وقتی نمی دونیم چقدر متغییر امکان داره همراه تابع تعریف کنیم یا تعداد اونها خیلی زیاد هست از این آرگومان های کلیدی استفاده میکنیم
در واقع یه جور امکان هست که بشما اجازه میده بی نهایت متغیر داشته باشی
(( یه همچین چیزایی )) :))))

CyberGhost
دوشنبه 23 تیر 1393, 22:24 عصر
خیلی ممنونم.فقط یک سوال دیگه که اخرین هم هست و زیاد وقتتون رو نمی گیرم و سرتون رو هم درد نمیارم.البته از اونجا که در مراجع فارسی در مورد این جور چیز ها زیاد توضیح داده نشده از جهتی فکر می کنم جواب این سوال ها برای کسانی که مثل من به دنبال پاسخ هستند،بسیار سودمند باشه.VarArgs ها چی هستند و به چه درد می خورند؟اگر هم باید تاپیک دیگری برای این سوال ایجاد کنم،لطفا بگویید.با تشکر از راهنمایی و صبر و حوصله شما.با احترام.

Bahmany
سه شنبه 24 تیر 1393, 09:45 صبح
خیلی ممنونم.فقط یک سوال دیگه که اخرین هم هست و زیاد وقتتون رو نمی گیرم و سرتون رو هم درد نمیارم.البته از اونجا که در مراجع فارسی در مورد این جور چیز ها زیاد توضیح داده نشده از جهتی فکر می کنم جواب این سوال ها برای کسانی که مثل من به دنبال پاسخ هستند،بسیار سودمند باشه.VarArgs ها چی هستند و به چه درد می خورند؟اگر هم باید تاپیک دیگری برای این سوال ایجاد کنم،لطفا بگویید.با تشکر از راهنمایی و صبر و حوصله شما.با احترام.

خواهشم میکنم ، بحث جالبیه
در جاوا کد دستور زیر رو توجه بفرمایید :

String.format("This is an integer: %d", myInt);
String.format("This is an integer: %d and a string: %s", myInt, myString);


توجه بفرمایید در تابع بالا یک متغیر رشته ای وجود دارد و بعد از آن تعداد نامعلومی متغیر که قرار است در محل های مشخص شده در متغیر رشته ای جاگذاری بشوند
البته این مثال برای جاوا بود
در الگوی جاری فراخوانی تابع در پایتون ، پایتون به آرگیومنت ها اجازه میده تا به دو صورت Positional یا Keyword فراخوانی بشن. در نتیجه یه آرگیومنت می تونه بطور صریح تو یه سری نام تعریف بشه و یا بصورت محل قرارگیری ( Positional ) یا تلویحی ( که در مثال های بالا بهش پرداخته شده )
در اینجا امکان داره شرایطی پیش بیاد که یک تابع تعداد متغیری از آرگیومنت ها رو بکار بگیره. زبان پایتون با پشتیبانی از varargs با سینتکس ('*varname') تمامی آرگیومنت های سمت چپ یک تابع رو به این متغیر اختصاص میده
در اینجا نکته ای که وجود داره اینکه تمام آرگیومنت های معمول تعریف شده در یک تابع قبل از رسیدن به varargs باید فراخونی بشن. این داستان همیشه مورد پسند برنامه نویس نیست.


def sortwords(case_sensitive=False*,wordlist):
...

Bahmany
سه شنبه 24 تیر 1393, 09:53 صبح
حالا از همه ی این بحث ها به کدهای زیر هم نگاهی بشه خالی از لطف نیست :


>>> def f(x,y,z):
... print(x,y,z)
...
>>> p = (47,11,12)
>>> f(*p)
(47, 11, 12)


>>> f(p[0],p[1],p[2])
(47, 11, 12)
>>>




def arithmetic_mean(x, *l):
""" The function calculates the arithmetic mean of a non-empty
arbitrary number of numbers """
sum = x
for i in l:
sum += i

return sum / (1.0 + len(l))



>>> from statistics import arithmetic_mean
>>> arithmetic_mean(4,7,9)
6.666666666666667
>>> arithmetic_mean(4,7,9,45,-3.7,99)
26.71666666666667



>>> l = [4,7,9,45,-3.7,99]
>>> arithmetic_mean(l)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "statistics.py", line 8, in arithmetic_mean
return sum / (1.0 + len(l))
TypeError: unsupported operand type(s) for /: 'list' and 'float'



>>> arithmetic_mean(*l)
26.71666666666667
>>>




>>> def f(**args):
... print(args)
...
>>> f()
{}
>>> f(de="Germnan",en="English",fr="French")
{'fr': 'French', 'de': 'Germnan', 'en': 'English'}
>>>




>>> def f(a,b,x,y):
... print(a,b,x,y)
...
>>> d = {'a':'append', 'b':'block','x':'extract','y':'yes'}
>>> f(**d)
('append', 'block', 'extract', 'yes')






>>> t = (47,11)
>>> d = {'x':'extract','y':'yes'}
>>> f(*t, **d)
(47, 11, 'extract', 'yes')
>>>