در درس ۱۲ ام آموزش رایگان پایتون می خواهیم در مورد چاپ خروجی در پایتون و بررسی دقیق دستور print صحبت کنیم.
خروجی با استفاده از تابع ()print
تابع ()print در پایتون پیام را در صفحه نمایش یا هر دستگاه خروجی استاندارد دیگری چاپ میکند. در این مقاله در دیتایاد، در مورد تابع ()print در پایتون و همچنین عملیاتهای مختلف آن بحث خواهیم کرد.
سینتکس (نوشتار صحیح) تابع ()print در پایتون
Syntax : print(value(s), sep= ‘ ‘, end = ‘\n’, file=file, flush=flush)
پارامترها:
- value(s): هر مقداری، و به هر تعدادی که دوست دارید. این مقادیر به رشته تبدیل شده و چاپ میشوند.
- sep=’جداکننده’: (اختیاری) مشخص میکند اشیاء مورد نظر برای چاپ چطور از هم جدا شوند. پیشفرض: ‘ ‘
- end=’پایان’: (اختیاری) مشخص میکند در انتها چه چیزی چاپ شود. پیشفرض: ‘\n’
- file: (اختیاری) یک شیء با متد write. پیشفرض: sys.stdout
- flush: (اختیاری) یک بولین، مشخص میکند خروجی پاکسازی شود (True) یا در حافظه نگهداری شود (False). پیشفرض: False
نوع بازگشت دستور:
- خروجی را به صفحه نمایش برمیگرداند.
گرچه لازم نیست آرگومانها را در تابع ()print وارد کنید، اما نیاز به یک پرانتز خالی در انتها دارید که این پرانتز به پایتون میگوید تابع را اجرا کند، نه اینکه نام آن فراخوانی شود. اکنون، بیایید آرگومانهای اختیاری را که میتوان با تابع ()print استفاده کرد را، بررسی کنیم.
مثال:
در این مثال، ما سه متغیر integer، string و float ایجاد کردهایم و تمام متغیرها را با تابع ()print در پایتون چاپ میکنیم.
name = "John" age = 30 height = 1.78 print("Name:", name) print("Age:", age) print("Height:", height)
خروجی:
Name: John Age: 30 Height: 1.78
چگونگی کارکرد تابع ()print در پایتون
شما میتوانید متغیرها، رشتهها، اعداد یا انواع دادههای دیگر را به عنوان یک یا چند پارامتر هنگام استفاده از این تابع، وارد آن کنید. سپس، این پارامترها به وسیله توابع ()str مربوطه به عنوان رشتهها نمایش داده میشوند. برای ایجاد یک رشته خروجی واحد، رشتههای تبدیل شده با فاصلههای بین آنها به هم پیوسته میشوند.
در این کد، ما دو پارامتر name و age را به طور همزمان وارد تابع print میکنیم.
name = "Alice" age = 25 print("Hello, my name is", name, "and I am", age, "years old.")
خروجی:
Hello, my name is Alice and I am 25 years old.
رشتههای حرفی (راهنما) در پایتون
رشتههای حرفی در دستور print پایتون عمدتاً برای فرمتبندی یا طراحی نحوه نمایش یک رشته خاص هنگام چاپ با استفاده از تابع ()print به کار میروند.
- n\: این رشته حرفی برای افزودن یک خط خالی جدید هنگام چاپ یک عبارت استفاده میشود.
- “”: یک نقل قول خالی (“”) برای چاپ یک خط خالی استفاده میشود.
مثال:
این کد از n\ برای چاپ دادهها در خط جدید استفاده میکند.
print("Datayad \n is the best for DSA Content.")
خروجی:
Datayad is the best for DSA Content.
پارامتر “end” در تابع ()print پایتون
کلمه کلیدی end برای مشخص کردن محتوایی که قرار است در انتهای اجرای تابع ()print چاپ شود، استفاده میشود. به صورت پیشفرض، روی “n\” تنظیم شده است که باعث رفتن به خط بعد پس از اجرای دستور ()print میشود.
مثال
در این مثال، ما از تابع ()print با پارامتر end و بدون پارامتر end استفاده میکنیم.
# This line will automatically add a new line before the # next print statement print ("Datayad is the best platform for DSA content") # This print() function ends with "**" as set in the end argument. print ("Datayad is the best platform for DSA content", end= "**") print("Welcome to DTY")
خروجی:
Datayad is the best platform for DSA content Datayad is the best platform for DSA content**Welcome to DTY
مثال:
در اینجا، میتوانیم یک عبارت چاپ را با هر کاراکتر یا رشتهای با استفاده از این پارامتر به پایان برسانیم.
# ends the output with a space print("Welcome to", end = ' ') print("datayad", end= ' ')
خروجی:
Welcome to datayad
مثال:
یک برنامه دیگر برای نمایش عملکرد پارامتر end.
# ends the output with '@' print("Python", end='@') print("datayad")
خروجی:
Python@datayad
مثال:
تابع ()print از پارامتر sep برای جداسازی آرگومانها استفاده میکند و بعد از آخرین آرگومان به پایان میرسد.
print('D','T', sep='', end='') print('Y') #\n provides new line after printing the year print('09','12','2023', sep='-', end='\n') print('Red','Green','Blue', sep=',', end='@') print('datayad')
خروجی:
DTY 09-12-2023 Red,Green,Blue@datayad
استفاده از end برای اتصال رشتهها
در این مثال، ما از پارامتر end برای اتصال دو عبارت چاپ به یک خط خروجی تکی استفاده میکنیم. پارامتر end برای اولین عبارت چاپ به یک کاراکتر فاصله (” “) تنظیم شده است، بنابراین عبارت چاپ دوم بر روی همان خط آغاز میشود و عبارات توسط یک کاراکتر فاصله از یکدیگر جدا میشوند.
پارامتر end یک ویژگی مفید از تابع print در پایتون است که میتوان از آن برای کنترل قالببندی خروجی به روشهای مختلف استفاده کرد.
name = "Alice" age = 30 print("My name is", name, "and I am", age, "years old.", end=" ") print("Nice to meet you!")
خروجی:
My name is Alice and I am 30 years old. Nice to meet you!
چاپ رشتههای ادغام شده
در این مثال، ما در درون تابع ()print در پایتون، رشتهها را به هم متصل میکنیم.
print('Datayad is a Wonderful ' + 'Website.')
خروجی:
Datayad is a Wonderful Website.
فرمتبندی خروجی
در این مثال، ما خروجی خود را با استفاده از تابع ()str.format برای زیباتر نشان دادن آن فرمتبندی میکنیم.
a,b,=10,1000 print('The value of a is {} and b is {}'.format(a,b))
خروجی:
The value of a is 10 and b is 1000
ورودی پایتون
در این مثال، ما از توابع print و input در پایتون برای گرفتن ورودی کاربر و چاپ آن در خروجی استفاده میکنیم.
n = input('Enter the Number: ') print('Number Entered by User:',n) print(type(n))
خروجی:
Enter the Number: 20 Number Entered by User: 20 <class 'str'>
پارامتر “flush” در تابع print پایتون
ورودی/خروجیها در پایتون به طور کلی دارای بافر هستند، به این معنا که به صورت بلوکی استفاده میشوند. اینجاست که flush مورد استفاده قرار میگیرد، زیرا به کاربران کمک میکند تا تصمیم بگیرند آیا میخواهند محتوای نوشته شده بافر شود یا نه.
مقدار آن به طور پیشفرض، روی false تنظیم شده است.
اگر به آن true بدهیم، خروجی به صورت یک توالی از کاراکترها، یکی پس از دیگری نوشته خواهد شد. اما این فرآیند کند خواهد بود، زیرا نوشتن به صورت بلوکی به جای نوشتن یک کاراکتر در هر زمان، راحتتر است.
برای درک مورد استفاده از آرگومان flush در تابع ()print، بیایید یک مثال را بررسی کنیم.
مثال:
تصور کنید که شما در حال ساخت یک تایمر شمارش معکوس هستید که زمان باقیمانده را هر ثانیه به همان خط اضافه میکند. ظاهر آن مانند زیر خواهد بود:
۳>>>۲>>>۱>>>start
کد اولیه برای این مثال به شکل زیر خواهد بود:
import time count_seconds = 3 for i in reversed(range(count_seconds + 1)): if i > 0: print(i, end='>>>') time.sleep(1) else: print('Start')
پس، کد بالا متن را بدون خط جدید در پایان اضافه میکند و سپس بعد از هر بار افزودن متن، یک ثانیه مکث میکند. در انتهای شمارش معکوس، “Start” چاپ شده و خط به پایان میرسد.
اگر کد را همینطور که هست اجرا کنید، برنامه ابتدا ۳ ثانیه صبر میکند و بعد تمام متن را یکجا نشان میدهد. این به خاطر بافر شدن متن است و ۳ ثانیه تلف میشود. برای دیدن خروجی به تصویر زیر مراجعه کنید.
گرچه بافر کردن مفید است، اما گاهی اثرات ناخواستهای میتواند داشته باشد، مانند مثال بالا. برای حل این مشکل، از آرگومان flush در تابع print استفاده میکنیم. حالا آرگومان flush را true کنید و نتایج را دوباره ببینید.
import time count_seconds = 3 for i in reversed(range(count_seconds + 1)): if i > 0: print(i, end='>>>', flush = True) time.sleep(1) else: print('Start')
خروجی:
پارامتر “sep” در تابع ()print پایتون
جداکننده بین آرگومانها در تابع print در پایتون به طور پیشفرض فاصله (softspace feature) است، که میتوان آن را تغییر داد و به هر کاراکتر، عدد یا رشتهای به دلخواه ما تبدیل کرد. پارامتر ‘sep’ برای دستیابی به همین هدف استفاده میشود و تنها در پایتون 3 و نسخههای جدیدتر آن وجود دارد. این پارامتر همچنین برای قالببندی رشتههای خروجی نیز استفاده میشود.
تابع print میتواند هر تعداد آرگومانهای موقعیتی را بپذیرد. برای جدا کردن این آرگومانهای موقعیتی، آرگومان کلیدی “sep” استفاده میشود.
توجه: چون sep، end، flush و file آرگومانهای کلیدی هستند، موقعیت آنها نتیجه کد را تغییر نمیدهد.
مثال:
این کد نشان میدهد که چگونه میتوانیم از آرگومان sep برای چندین متغیر استفاده کنیم.
a=12 b=12 c=2022 print(a,b,c,sep="-")
خروجی:
12-12-2022
مثال:
آرگومانهای موقعیتی نمیتوانند بعد از آرگومانهای کلیدی ظاهر شوند. در مثال زیر، ۱۰، ۲۰ و ۳۰ آرگومانهای موقعیتی هستند، در حالی که sep=’ – ‘ یک آرگومان کلیدی است.
print(10, 20, sep=' - ', 30)
خروجی:
File "0b97e8c5-bacf-4e89-9ea3-c5510b916cdb.py", line 1 print(10, 20, sep=' - ', 30) ^ SyntaxError: positional argument follows keyword argument
مثال:
در این کد، از تابع print برای چاپ رشتهها با جداکنندههای مختلف استفاده میشود. در مثال اول، کاما به عنوان جداکننده استفاده میشود، در مثال دوم، نقطه و کاما استفاده میشود و در مثال سوم، علامت سوال استفاده میشود.
# using a comma separator print('apples', 'oranges', 'bananas', sep=', ') # output: apples, oranges, bananas # using a semicolon separator print('one', 'two', 'three', sep=';') # output: one;two;three # using an emoji separator print('????', '????', '????', sep='????') # output: ????????????????????
خروجی:
apples, oranges, bananas one;two;three ????????????????????
پارامتر “file” در تابع ()print پایتون
بر خلاف تصور رایج، تابع print پیامها را به متن روی صفحه تبدیل نمیکند. این کار توسط لایههای پایینتر کد انجام میشود که میتوانند دادهها (پیام) را به صورت بایتها بخوانند. تابع print یک رابط بر روی این لایهها است که چاپ واقعی را به یک جریان یا شیء شبیهفایل واگذار میکند. به طور پیشفرض، تابع print از طریق آرگومان file به sys.stdout متصل است.
با ماژول IO
این کد یک فایل ساختگی (موقت) را با استفاده از ماژول io در پایتون ایجاد میکند. سپس پیامی با مضمون “!!Hello Geeks” را با استفاده از تابع print به فایل اضافه میکند و پارامتر file را به عنوان فایل ساختگی مشخص میکند.
import io # declare a dummy file dummy_file = io.StringIO() # add message to the dummy file print('Hello Geeks!!', file=dummy_file) # get the value from dummy file print(dummy_file.getvalue())
خروجی:
Hello Geeks!!
نوشتن در یک فایل با تابع ()print پایتون
این کد دادههای موجود در تابع ()print را در یک فایل متنی مینویسد.
print('Welcome to datayad Python world', file=open('Testfile.txt', 'w'))
در این حالت چیزی در خروجی چاپ نمیشود، بلکه عبارت نوشته شده در یک فایل متنی نوشته میشود. رجوع به تصویر زیر.
توجه:
لطفاً کد زیر را اجرا کنید، و نتیجه آن را ببینید. اجرای آن یک سایت جالب را به شما نشان میدهد.
#import the below module and see what happens import antigravity #NOTE - it wont work on online ide
نکته پایانی
پیچیدگی زمانی:
پیچیدگی زمانی تابع print با O(n) نمایش داده میشود، که در آن n تعداد کل کاراکترهایی است که باید چاپ شوند. با این حال، پیچیدگی زمانی مشخص کردن جداکننده O(1) است، زیرا یک عملیات ثابت است.
پیچیدگی فضایی:
پیچیدگی فضایی کد نیز O(n) است، که در آن n تعداد کل کاراکترهایی است که باید چاپ شوند. این به این دلیل است که تابع print نیاز به تخصیص حافظه برای ذخیره رشتهها و جداکنندهها قبل از چاپ آنها دارد.
در کل، کد دارای پیچیدگی زمانی ثابت برای مشخص کردن جداکننده و پیچیدگی زمانی و فضایی خطی برای چاپ رشتهها و جداکنندهها است.