Standardowe wyjście

https://docs.python.org/3/tutorial/inputoutput.html

https://docs.python.org/3/library/string.html

WPROWADZENIE

Podstawowe polecenie do wyprowadzania wyników w Pythonie 2 to print. Jest to przyjazny programiście interfejs do standardowego strumienia wyjścia (stdout). Polecenie przekształca obiekt na jego reprezentację tekstową, dodaje formatowanie i przesyła do standardowego wyjścia.

Kolejne elementy po słowie print oddzielamy przecinkami. Przecinek na końcu wiersza z print zapobiega wyświetleniu "\n", czyli przejściu do nowej linii.

W Pythonie 3 print() jest funkcją wbudowaną.


# Konstrukcja podobna do C z procentem i krotką.
# Składnia:
# %[(nazwa)][opcje][szerokość][.precyzja]kod_typu
print("int %d float %f str %s" % (5, 3.14159, "napis"))

# Format z %s jest uniwersalny - korzysta z funkcji str().
print("int %s float %s str %s" % (5, 3.14159, "napis"))

print("%-10s|%10s" % ("napis1", "napis2"))
print("pi = %8.2f" % 3.14159)            # po procencie jest krotka
print("pi = %8.2f" % (3.14159,))         # bardziej precyzyjnie
print("a %10.1f b %3d" % (1.23456, 2))   # dwie lub więcej pozycji

# Wyprowadzanie danych do pliku:
afile = open("data.txt", "w")
afile.write("%s %s\n" % (item1, item2))   # jeden sposób
afile.write("{} {}\n".format(item1, item2))   # drugi sposób
print >> afile, item1, item2        # niezbyt ładne, Py2
print(file=afile, item1, item2)           # Py3
afile.close()

# Korzystanie z modułu sys.
# Obiekt sys.stdout jest typu file, mode "w".

import sys
print(X)
sys.stdout.write(str(X) + "\n")  # jw, równoważne
sys.stdout.write("%s\n" % X)     # jw, ale będzie problem dla X tuple
print("{} {}".format("alpha", "beta"))   # zalecane
sys.stdout.write("%s %s\n" % ("alpha", "beta"))  # jw
sys.stdout.write("{} {}\n".format("alpha", "beta"))   # jw

# Można na chwilę zmienić stdout:
import sys
tmp = sys.stdout
sys.stdout = open("log.txt", "a")
print("napis")          # komunikat idzie do pliku
sys.stdout.close()
sys.stdout = tmp

# Korzystanie ze słownika przy formatowaniu stringu.
phones = {"Adam": 1234, "Bogdan": 3456, "Czarek": 5678}
print("Telefony: Adam: %(Adam)s, Bogdan: %(Bogdan)s." % phones)

# Można wykorzystać funkcję systemową zwracającą słownik.
name = "elektron"
mass = 0.511034    # MeV
print("%(name)s, masa %(mass)s MeV" % locals())

# Zapis wywołań print działający w Py2 i Py3.
print("napis")   # jeden obiekt
print("%s %s %s" % (item1, item2, item3))
print("{} {} {}".format(item1, item2, item3))   # zalecane

# Emulacja funkcji print() z Py3 w Py2.
# print(value, ..., sep=' ', end='\n', file=sys.stdout, flush=False)

def print3(*arguments, **keywords):
    import sys
    sep = keywords.get("sep", " ")
    end = keywords.get("end", "\n")
    file = keywords.get("file", sys.stdout)
    output = sep.join(str(arg) for arg in arguments)
    file.write(output + end)

# Zastosowanie.
print3(1, 2, 3)              # zwykłe wywołanie
print3(1, 2, 3, sep="")      # wstrzymanie separatora
print3(1, 2, 3, sep="...")   # zmiana separatora
print3(4, 5, 6, end="")      # wstrzymanie nowego wiersza
print3(7, 9, 9, file=sys.stderr)       # przekierowanie strumienia

# PEP 236 - Back to the __future__
# W Py2.6 można włączyć obsługę funkcji print()
# z Py3 za pomocą instrukcji import.
# Ta instrukcja nie powoduje błędu w Py3.

from __future__ import print_function

METODA FORMAT


# Składnia (Py2.6+, Py3):
# S.format(*arguments, **keywords)

# Argumenty pozycyjne.
print("{0} albo {1}".format("prawda", "fałsz"))   # prawda albo fałsz
print("{} albo {}".format("prawda", "fałsz"))   # prawda albo fałsz (Py2.7, Py3)
print("{1} albo {0}".format("prawda", "fałsz"))   # fałsz albo prawda
print("{0} {0} {1} {1}".format("prawda", "fałsz"))   # prawda prawda fałsz fałsz

# Formatowanie {position:format_spec}.
# {position:10} typ str, szerokość minimum 10 znaków;
# {position:4d} typ int, szerokość minimum 4 znaki;
# {position:.3f} typ float, 3 cyfry po przecinku;
# {position:8.1f} typ float, 1 cyfra po przecinku, całość 8 znaków;
for x in range(1, 11):
    print ( "{0:2d} {1:3d}".format(x, x*x) )

# Argumenty w postaci słów kluczowych.
print("{person} jest {description}".format(
    person="Adam", description="okropny"))

# Formatowanie {key:format_spec}.
# {key:d} key wskazuje na typ int;

# Argumenty pozycyjne i słowa kluczowe można używać łącznie.
print("Kali liczyć: {0}, {1}, {2}, {last}.".format(
    "jeden", "dwa", "trzy", last="mnóstwo"))
# Kali liczyć: jeden, dwa, trzy, mnóstwo.

# Formatowania {position!conversion:format_spec} oraz
# {key!conversion:format_spec}.
# {position!s} wymusza formatowanie obiektu przez str().
# {position!r} wymusza formatowanie obiektu przez repr().
# {position!a} wymusza formatowanie obiektu przez ascii() (Py3).
# Podobnie {key!s}, {key!r}, {key!a} (Py3).

import math
print("PI wynosi {0} {0!s} {0!r}".format(math.pi))
# 'PI wynosi 3.14159265359 3.14159265359 3.1415926535897931'

# Zastosowanie słownika ze słowami kluczowymi.
table = {"Adam":1234, "Bogdan":5678}
print("Adam {Adam:d}; Bogdan {Bogdan:d}".format(**table))
# Adam 1234; Bogdan 5678

# Using alignment options in format_spec.
# '<' forces the field to be left-aligned within the available space
# '>' forces the field to be right-aligned within the available space
# '^' forces the field to be centered within the available space
# '=' forces the padding to be placed after the sign (if any) 
#    but before the digits (‘+000000120’)

"|{0:>3}|{1:<3}|{2:^3}|{3:0=+5}|".format('a', 'b', 'c', 12)
# '|  a|b  | c |+0012|'   # [[fill]align][sign][width]

"{:*^20}".format("centered")   # use '*' as a fill char
# '******centered******'   # [[fill]align][width]

# Użycie nazwy atrybutu i indeksu elementu.
# Formatowanie {position.attr_name}, {position[idx]}.
# Formatowanie {key.attr_name}, {key[idx]}.

L = [11, 12, 13]
"{0[1]}".format(L)   # '12'
"{seq[2]}".format(seq=L)   # '13'

coord = (3, 5)
"x {0[0]}  y {0[1]}".format(coord)   # 'x 3 y 5'

p = Point(12, 34)
"{0.x}".format(p)   # '12'
"{point.y}".format(point=p)   # '34'

c = 2-4j
"complex {0} real {0.real} imag {0.imag}".format(c)
# 'complex (2-4j) real 2.0 imag -4.0'

# Using different bases.

"int: {0:d};  hex: {0:x};  oct: {0:o};  bin: {0:b}".format(42)
# 'int: 42;  hex: 2a;  oct: 52;  bin: 101010'

# with 0x, 0o, or 0b as prefix:
"int: {0:d};  hex: {0:#x};  oct: {0:#o};  bin: {0:#b}".format(42)
# 'int: 42;  hex: 0x2a;  oct: 0o52;  bin: 0b101010'

F-STRINGS


# W Py3.6 pojawiły się f-strings, formatted string literals (PEP 498).
# F-strings są szybsze od metody z % i format().
# Rozpoczynają się od prefiksu 'f' lub 'F', w klamrach {} są wyrażenia lub zmienne.
name = "Adam"
age = 18
print(f"Hello, {name}. You are {age}.")
print(f'{2 * 37}')   # "74"
print(f"{{18}}")   # wynik to "{18}"
print(f"""{function_name(argument)} is funny.""")
print(f'''{instance.method()} is fast.''') 
print(f"{variable!r}")  # używa repr(), a nie str()

message = (
    f"First part {variable1}. "
    f"Second part {variable2}. "
    f"Third part {variable3}."
)   # multiline f-strings (rezultat to jeden wiersz!)

name, phone = 'Andrzej', 4628
f'|{name:10}|{phone:10d}|'   # '|Andrzej   |      4628|'
# Alignment options can be used.
f'|{name:>10}|{phone:<10}|'   # '|   Andrzej|4628      |'