Prezentăm un truc grozav care se poate face cu șiruri:
def shout(string):
for character in string:
print("Gimme an " + character)
print("'" + character + "'")
shout("Lose")
def middle(string):
print("The middle character is:", string[len(string) // 2])
middle("abcdefg")
middle("The Python Programming Language")
middle("Atlanta")
Și ieșirea este:
Gimme an L 'L' Gimme an o 'o' Gimme an s 's' Gimme an e 'e' The middle character is: d The middle character is: r The middle character is: a
Ceea ce demonstrează aceste programe este că șirurile sunt similare listelor în mai multe moduri. Funcția shout()
arată că buclele for pot fi folosite cu șiruri de caractere la fel cum pot fi folosite cu liste. Procedura de mijloc arată că acele șiruri de caractere pot folosi, de asemenea, funcția len()
și indici și părți de matrice. Cele mai multe caracteristici ale listei funcționează și pe șiruri.
Următoarea caracteristică demonstrează câteva caracteristici specifice șirului:
def to_upper(string):
## Converts a string to upper case
upper_case = ""
for character in string:
if 'a' <= character <= 'z':
location = ord(character) - ord('a')
new_ascii = location + ord('A')
character = chr(new_ascii)
upper_case = upper_case + character
return upper_case
print(to_upper("This is Text"))
cu ieșirea fiind:
THIS IS TEXT
Acest lucru funcționează deoarece computerul reprezintă caracterele unui șir ca numere de la 0 la 1.114.111. De exemplu, „A” este 65, „B” este 66 și א este 1488. Valorile sunt în format unicod. Python are o funcție numită ord()
(prescurtare de la ordinal) care returnează un caracter ca număr. Există, de asemenea, o funcție corespunzătoare numită chr()
care convertește un număr într-un caracter. Având în vedere acest lucru, programul ar trebui să înceapă să fie clar. Primul detaliu este linia: if 'a' <= character <= 'z':
care verifică dacă o literă este cu minuscule. Dacă este, atunci se folosesc rândurile următoare. Mai întâi este convertit într-o locație astfel încât a = 0, b = 1, c = 2 și așa mai departe cu linia: location = ord(character) -
. Apoi noua valoare este găsită cu
ord('a')new_ascii = location +
. Această valoare este convertită înapoi într-un caracter care este acum majuscule. Rețineți că, dacă aveți nevoie într-adevăr de majuscule ale unei litere, ar trebui să utilizați
ord('A')u=var.upper()
care va funcționa și cu alte limbaje.
Acum, pentru un exercițiu interactiv de tastare:
>>> # De la întreg la șir >>> 2 2 >>> repr(2) '2' >>> -123 -123 >>> repr(-123) '-123' >>> # De la șit la întreg >>> "23" '23' >>> int("23") 23 >>> "23" * 2 '2323' >>> int("23") * 2 46 >>> # De la float la șir >>> 1.23 1.23 >>> repr(1.23) '1.23' >>> # De la float la întreg >>> 1.23 1.23 >>> int(1.23) 1 >>> int(-1.23) -1 >>> # De la șit la float >>> float("1.23") 1.23 >>> "1.23" '1.23' >>> float("123") 123.0
Dacă nu ați ghicit deja, funcția repr()
poate converti un număr întreg într-un șir, iar funcția int()
poate converti un șir într-un număr întreg. Funcția float()
poate converti un șir într-un float. Funcția repr()
returnează o reprezentare imprimabilă a ceva. Iată câteva exemple în acest sens:
>>> repr(1) '1' >>> repr(234.14) '234.14' >>> repr([4, 42, 10]) '[4, 42, 10]'
Funcția int()
încearcă să convertească un șir (sau un float) într-un număr întreg. Există, de asemenea, o funcție similară numită
care va converti un întreg sau un șir într-un float. O altă funcție pe care o are Python este funcția
float()eval()
. Funcția
ia un șir și returnează date de tipul pe care Python crede că le-a găsit. De exemplu:
eval()
>>> v = eval('123') >>> print(v, type(v)) 123 <type 'int'> >>> v = eval('645.123') >>> print(v, type(v)) 645.123 <type 'float'> >>> v = eval('[1, 2, 3]') >>> print(v, type(v)) [1, 2, 3] <type 'list'>
Dacă utilizați funcția eval()
, ar trebui să verificați dacă returnează tipul la care vă așteptați.
O funcție șir utilă este metoda split()
. Iată un exemplu:
>>> "This is a bunch of words".split() ['This', 'is', 'a', 'bunch', 'of', 'words'] >>> text = "First batch, second batch, third, fourth" >>> text.split(",") ['First batch', ' second batch', ' third', ' fourth']
Observați cum split()
convertește un șir într-o listă de șiruri. Șirul este împărțit implicit prin spații albe sau după argumentul opțional (în acest caz o virgulă). De asemenea, puteți adăuga un alt argument care spune lui split()
de câte ori va fi folosit separatorul pentru a împărți textul. De exemplu:
>>> list = text.split(",") >>> len(list) 4 >>> list[-1] ' fourth' >>> list = text.split(",", 2) >>> len(list) 3 >>> list[-1] ' third, fourth'
Tăierea șirurilor (și listelor)
Șirurile pot fi tăiate în piese — în același mod în care a fost arătat pentru liste din capitolul anterior — folosind operatorul „de tăiere ” []. Operatorul de tăiere funcționează în același mod ca și înainte: text[first_index:last_index] (în cazuri foarte rare pot exista alte două puncte și un al treilea argument, ca în exemplul prezentat mai jos).
Pentru a nu fi confundat cu numerele de index, cel mai ușor este să le vedeți ca locuri de tăiere, posibilități de a tăia un șir în părți. Iată un exemplu, care arată locurile de tăiere (în galben) și numerele lor de index (roșu și albastru) pentru un șir de text simplu:
0 | 1 | 2 | … | -2 | -1 | ||||||||||
↓ | ↓ | ↓ | ↓ | ↓ | ↓ | ↓ | |||||||||
text = | „ | S | T | R | I | N | G | „ | |||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
↑ | ↑ | ||||||||||||||
[: | :] |
Rețineți că indicii roșii sunt numărați de la începutul șirului, iar cei albaștri de la sfârșitul șirului înapoi. (Rețineți că nu există -0 albastru, care ar putea părea a fi logic la sfârșitul șirului. Deoarece -0 == 0, -0 înseamnă și „începutul șirului”.) Acum suntem gata să folosim indexuri pentru operațiunile de tăiere:
text[1:4] | → | „TRI” |
text[:5] | → | „STRIN” |
text[:-1] | → | „STRIN” |
text[-4:] | → | „RING” |
text[2] | → | „R” |
text[:] | → | „STRING” |
text[::-1] | → | „GNIRTS” |
text[1:4] ne dă întregul șir de text dintre locurile de tăiere 1 și 4, „TRI„. Dacă omiteți unul dintre argumentele [first_index:last_index], obțineți începutul sau sfârșitul șirului implicit: text[:5] dă „STRIN„. Atât pentru first_index, cât și pentru last_index putem folosi atât schema de numerotare roșie, cât și albastră: text[:-1] dă la fel ca text[:5], deoarece indexul -1 este în același loc cu 5 în acest caz. Dacă nu folosim un argument care conține două puncte, numărul este tratat într-un mod diferit: text[2 ne dă un caracter după al doilea punct de tăiere, „R„. Operațiunea specială de tăiere text[:] înseamnă „de la început până la sfârșit” și produce o copie a întregului șir (sau a listei, așa cum se arată în capitolul anterior).
Nu în ultimul rând, operația de tăiere poate avea un al doilea punct și un al treilea argument, care este interpretat ca „dimensiunea pasului”: text[::-1] este text de la început până la sfârșit, cu dimensiunea pasului de -1 . -1 înseamnă „fiecare caracter, dar în cealaltă direcție”. „STRING” înapoi este „GNIRTS” (testați o lungime de pas de 2, dacă nu ați înțeles punctul aici).
Toate aceste operațiuni de tăiere funcționează și cu liste. În acest sens, șirurile sunt doar un caz special de liste, în care elementele listei sunt caractere simple. Amintiți-vă doar conceptul de locuri de tăiere, iar indexurile pentru tăierea lucrurilor vor deveni mult mai puțin confuze.
Exemple
# Acest program necesită o înțelegere excelentă a numerelor zecimale.
def to_string(in_int):
"""Converts an integer to a string"""
out_str = ""
prefix = ""
if in_int < 0:
prefix = "-"
in_int = -in_int
while in_int // 10 != 0:
out_str = str(in_int % 10) + out_str
in_int = in_int // 10
out_str = str(in_int % 10) + out_str
return prefix + out_str
def to_int(in_str):
"""Converts a string to an integer"""
out_num = 0
if in_str[0] == "-":
multiplier = -1
in_str = in_str[1:]
else:
multiplier = 1
for c in in_str:
out_num = out_num * 10 + int(c)
return out_num * multiplier
print(to_string(2))
print(to_string(23445))
print(to_string(-23445))
print(to_int("14234"))
print(to_int("12345"))
print(to_int("-3512"))
Ieșirea este
2 23445 -23445 14234 12345 -3512
(Include texte din Wikibooks traduse și adaptate de Nicolae Sfetcu)
Lasă un răspuns