انجمنهای فارسی اوبونتو
کمک و پشتیبانی => برنامهسازی => نویسنده: Nelliel در 18 آذر 1395، 09:48 قظ
-
سلام
فرض کنیم من یه اسکریپت دارم که ممکنه بی نهایت آرگیومنت بهش بدیم موقع اجرا, حالا یه حلقه ی for دارم که هر چی آرگیومنت میگیره را خروجیش را چاپ کنه بیرون, مثل این:
#/bin/python3
# Importing Needed Libraries
import sys
# Checking Arguments
for arg in sys.argv:
print(arg)
حالا با این دستور اسکریپت را اجرا میکنم و همون موقع هم یه سری آرگیومنت بهش میدم:
python3 folan.py arg1 arg2 arg3
و خروجی میشه:
folan.py
arg1
arg2
arg3
ولی من میخوام folan.py یا در واقع argv[0] چاپ نشه و بقیه اش چاپ بشه! که میشه:
arg1
arg2
arg3
حالا چه تغییری توی for بدم که اولین کلمه را چاپ نکنه ولی بقیه را چاپ کنه؟
-
داداش خودت همه کارا رو کردی دیگه چی می خوای ;)
فقط همون طور که گفتی کافیه به پایتون بگی آرگومان 0 رو پرینت نکن :
import sys
for arg in sys.argv:
if arg != sys.argv[0]:
print(arg)
راه دوم :
import sys
sys.argv.remove(sys.argv[0])
for arg in sys.argv:
print(arg)
راه سوم و اما بهترین راه (چون قسمتی از لیست حذف نمی شه و هم چنین کم ترین تغییر رو انجام می دیم و البته کمترین کد رو هم می نویسیم):
import sys
for arg in sys.argv[1:]:
print(arg)
فقط کافیه به چشم یه لیست بهش نیگاه کنی فقط همین !
-
ممنون :) 6 ماهی میشد سراغ پایتون نرفته بودم برای همین سوالات مسخره و مشکل سینتکسی برام پیش اومد :)
-
همون راه سوم که پیشنهاد دادن راه خوبی هست.. راه دوم هم خوبه.. ولی راه اول مشکل داره.. اگه بقیه ی آرگومان ها با آرگومان اول برابر باشن برنامه در نظر نمی گیره اونا رو.. مثلا python test.py test.py
-
بله داداش حق با شماست :)
اگه بخوایم قسمت یکو اصلاح کنیم به طوری که همون فرم for و if باقی بمونه می تونیم این شکلی بنویسیم :
import sys
temp = 0
for arg in sys.argv:
temp += 1
if temp != 1:
print(arg)
در مورد راه دوم هم راستش خودم ازش اصلا خوشم نمیاد چون یکی از آرگومان ها رو از دست می دیم ولی راه سوم واقعا بهترین راهه ;)
-
import sys
for num, val in enumerate(sys.argv):
if num != 0: print(val)