Isoqjanov Ilyos | Python
512 subscribers
34 photos
13 videos
2 files
60 links
🐍 Python bo'yicha o'zbek tilidagi sifatli materiallarni ko'paytirishda o'zing madadkor bo'lgin Allohim.

Shaxsiy blogim:
https://t.me/coldboot_blog

Admin:
@JurabekAbdusattarov,
@pythonwithcoldboot
Download Telegram
🧠 Python masala: Unikal so‘zlar sonini hisoblash

Masala:
Foydalanuvchidan satr (matn) qabul qiladigan funksiya yozing va shu satrdagi unikal (takrorlanmas) so‘zlar sonini qaytaring.
Satrda so‘zlar bo‘sh joy bilan ajratilgan, tinish belgilari olib tashlanishi kerak.

📌 Tushuntirish:
Ushbu kodda string.punctuation yordamida barcha tinish belgilari aniqlanadi va str.translate() orqali ularni satrdan tozalaymiz.
Keyin butun matnni kichik harflarga o'tkazib, bo‘sh joy bo‘yicha bo‘lib chiqamiz va set yordamida unikal so‘zlarni sanaymiz.


import string

def count_unique_words(text):
text = text.translate(str.maketrans('', '', string.punctuation))
words = text.lower().split()
return len(set(words))

count_unique_words("Hello, hello world!") # ➝ 2


⚙️ Optimallashtirishlar (Performance):

Regulyar ifodalar (regex) yordamida tinish belgilari va so‘zlarni aniqlash aniqroq bo‘ladi:


import re

def count_unique_words(text):
words = re.findall(r'\b\w+\b', text.lower())
return len(set(words))


print(count_unique_words("Hello, world! Hello again.")) # ➝ 3
print(count_unique_words("Python, Java. Python?")) # ➝ 2


Siz bu funksiyani yana qanday optimallashtirar edingiz?
💬 Fikringizni kommentda yozing!

https://t.me/simplypythonuz
📦 #Python | gzip moduli — fayllarni siqish va arxivdan chiqarish

gzip moduli — bu .gz formatdagi fayllar bilan ishlashni soddalashtiruvchi kuchli vosita. U orqali matnli fayllarni siqish (compress) yoki arxivdan chiqarish (decompress) mumkin.

🔹 Asosiy imkoniyatlari:

- Fayllarni .gz formatda siqish
- .gz fayllarni o‘qish va arxivdan chiqarish
- Oddiy baytlar massivini siqish/decompress qilish

📘 Misollar:
1. Faylni siqish (compress)

import gzip

with open('data.txt', 'rb') as f_in:
with gzip.open('data.txt.gz', 'wb') as f_out:
f_out.writelines(f_in)


2. Siqilgan .gz faylni ochish (decompress)

import gzip

with gzip.open('data.txt.gz', 'rb') as f:
content = f.read()
print(content.decode('utf-8'))


3. Matnni bevosita siqish va ochish

import gzip

original = b"Salom, dunyo!"
compressed = gzip.compress(original)
decompressed = gzip.decompress(compressed)

print(decompressed.decode()) # ➝ Salom, dunyo!


⚠️ Eslatma: Bu modul faqat .gz formatni qo‘llab-quvvatlaydi. compress, pack kabi bash buyruqlari yaratgan fayllar mos kelmaydi.

https://t.me/simplypythonuz
🖼 #Python | Pillow — Python’da rasm bilan ishlash kutubxonasi

Pillow — bu mashhur Python Imaging Library (PIL) kutubxonasining davomidir. U rasm fayllari bilan ishlashni soddalashtiradi va quyidagi ishlar uchun juda qulay:

🔹 Rasmni boshqa formatga o‘tkazish
🔹 Filtrlar qo‘llash
🔹 Rasmni aylantirish
🔹 Thumbnail (miniatura) yaratish
🔹 Bir nechta rasmni paketli tarzda qayta ishlash

Pillow kutubxonasini o‘rnatish:

pip install Pillow


📚 Batafsil hujjat: pypi.org/project/Pillow

🧪 Misol: Rasmdan foydalanish va uni ko‘rsatish

from PIL import Image

# Rasmni ochish
img = Image.open("rasm.jpg")

# O‘lchamini ko‘rsatish
print(img.size)

# Rasmni ko‘rsatish
img.show()


Pillow — ko‘p sonli rasmlar bilan avtomatik ishlash kerak bo‘lganda (masalan, watermark qo‘yish, format o‘zgartirish) juda mos keladi. 👌

https://t.me/simplypythonuz
Quyida Pillow kutubxonasi yordamida rasmga watermark (suv belgisi) qo‘yish bo‘yicha oddiy misol:

💧 Rasmga watermark qo‘yish (Pillow bilan)

from PIL import Image, ImageDraw, ImageFont

# Rasmni RGBA formatda ochish
image = Image.open("rasm.jpg").convert("RGBA")

# Watermark uchun bo'sh qatlam
txt_layer = Image.new("RGBA", image.size, (255, 255, 255, 0))

# Chizuvchi obyekt
draw = ImageDraw.Draw(txt_layer)

# Shrift (yo‘lni o‘zingiznikiga moslang)
font = ImageFont.truetype("arial.ttf", 40)

# Watermark matni va joylashuvi
text = "© PythonWithTheBest"
position = (20, image.size[1] - 60)

# Watermark rangi (masalan: qizil va 100% shaffoflik)
# Rang formati: (R, G, B, A) — A: opacity (0–255)
color = (255, 0, 0, 255) # Qizil

# Matnni chizamiz
draw.text(position, text, font=font, fill=color)

# Asosiy rasm va watermarkni birlashtiramiz
watermarked = Image.alpha_composite(image, txt_layer)

# Saqlaymiz
watermarked.convert("RGB").save("rasm_watermarked.jpg", "JPEG")


📝 E'tibor bering:
- arial.ttf o‘rniga tizimingizdagi mavjud shriftni yozing (/usr/share/fonts, C:\Windows\Fonts, yoki .ttf fayl yo‘li).
- fill=(255, 255, 255, 128) bu oq rangli, 50% shaffof watermark.
- alpha_composite — qatlamlarni shaffoflik bilan birlashtiradi.

Bu usul yordamida logotip, matn, yoki mualliflik huquqi belgilarini rasm ustiga oson qo‘yishingiz mumkin.

https://t.me/simplypythonuz
👍1
watermark qo'yishdan oldin
Yuqoridagi kod orqali watermark qo'yilgan ko'rinishi (watermark chap pastki burchakda qizil rang bilan).
#Python | Internetdan rasmni yuklab olish
Agar sizda rasmning URL manzili bo‘lsa, uni kompyuteringizga yuklab olish uchun quyidagi oddiy Python dasturidan foydalanishingiz mumkin:


import requests

# Rasm URL manzili
url = "https://example.com/image.jpg"

# HTTP so'rov yuborish
response = requests.get(url)

# Agar so'rov muvaffaqiyatli bo'lsa, faylni yozamiz
if response.status_code == 200:
with open("rasm.jpg", "wb") as file:
file.write(response.content)
print(" Rasm muvaffaqiyatli saqlandi.")
else:
print(" Rasmni yuklab bo‘lmadi.")


🧠 Eslatma:
- requests moduli Python’da vebdan ma’lumot olish uchun ishlatiladi.
- Fayl .jpg, .png, .webp formatlarda bo‘lishi mumkin — .content orqali rasm binar ko‘rinishda olinadi.
- Fayl nomini istalgancha o‘zgartirishingiz mumkin: rasm.jpgavatar.png va hokazo.

https://t.me/simplypythonuz
#Python | if shartlarini soddalashtiring
Ko‘p qiymatlarni tekshirish kerak bo‘lganda, if operatorlarini quyidagi kabi soddalashtirish mumkin:

Noto‘g‘ri (keraksiz uzun):

if x == 1 or x == 2 or x == 3:
    print("Topildi")


To‘g‘ri (soddaroq va aniq):

if x in (1, 2, 3):
    print("Topildi")


🧠 Foydali maslahat:
x in (1, 2, 3) — bu x ning 1, 2 yoki 3 ga teng ekanini tekshiradi. Kodni o‘qish osonlashadi va yozish tezlashadi.

Bunday soddalashtirishlar kodni toza, ixcham va tushunarli qilishga yordam beradi 💡

https://t.me/simplypythonuz
2
🧼 #Python | Ichki ro‘yxatlardan (nested lists) dublikatlarni o‘chirish
Ba'zida sizda shunday ro‘yxat bo‘ladi:

lists = [[1, 2], [3, 4], [1, 2]]


Va siz dublikatlarni olib tashlamoqchisiz. Ammo set dan to‘g‘ridan-to‘g‘ri foydalana olmaysiz, chunki list o‘zgaruvchan (unhashable) tur.

Oddiy va samarali yechim:

lists = [[1, 2], [3, 4], [1, 2]]

# Dublikatlarni olib tashlaymiz
unique_lists = [list(t) for t in set(tuple(lst) for lst in lists)]

print(unique_lists)
# ➝ [[1, 2], [3, 4]]


🎯 Xulosa:
- Har bir ichki ro‘yxatni tuple ga aylantiring — ular set ichida ishlaydi
- set bilan dublikatlarni yo‘q qiling
- Natijani qayta list ga aylantiring

📌 Natija: tejamkor, tez va sikllarsiz kod

https://t.me/simplypythonuz
🔍 #Python | unhashable nima degani?
Pythonda set, dict kabi xotirada tartiblanadigan ma’lumotlar tuzilmalari (hash table) faqat hashable obyektlar bilan ishlay oladi.

Hashable — bu o‘zgarmas (immutable) obyektlar, masalan:
int, float, str, tuple (agar ichida hamma narsa hashable bo‘lsa)


x = (1, 2)
set([x])  # Ishlaydi


Unhashable — bu o‘zgaruvchan (mutable) obyektlar, masalan:
list, dict, set — bu obyektlar set yoki dict kaliti sifatida ishlatilmaydi.


x = [1, 2]
set([x])  # TypeError: unhashable type: 'list'


💡 Nega bu muhim?
Agar siz list larni set ichiga solmoqchi bo‘lsangiz, avval ularni tuple ga o‘giring:

lists = [[1, 2], [3, 4], [1, 2]]

# list → tuple → set → list
unique = [list(t) for t in set(tuple(x) for x in lists)]
print(unique)


🧠 Xulosa:

- hashable → o‘zgarmas, set va dict uchun ishlaydi.
- unhashable → o‘zgaruvchan, to‘g‘ridan-to‘g‘ri set ga qo‘shib bo‘lmaydi.

https://t.me/simplypythonuz
🔁 Counter.elements() metodi — Python'da foydali imkoniyat!

Counter.elements() — bu metod har bir elementni uning soniga qarab takrorlab, iterator ko‘rinishida qaytaradi.

Har bir element o‘z qiymati (soni) nechta bo‘lsa, shuncha marta chiqariladi.
Tartib saqlanadi — ya'ni elementlar Counter yaratilganidagi ketma-ketlikda bo‘ladi.
🚫 Agar element qiymati 1 dan kam bo‘lsa, u umuman chiqarilmaydi.

📌 Misol:


from collections import Counter

cnt = Counter({'a': 3, 'b': 1, 'c': 0})
print(list(cnt.elements()))
# Natija: ['a', 'a', 'a', 'b']


Python'da ma'lumotlar bilan ishlashni osonlashtiruvchi usullardan biri 💡
Xayrli tong! So'ngi paytlarda python olamidagi eng katta o'zgarishlardan biri bu uv bo'lsa kerak.
Menimcha ko'pchilik duch kelayotgan yoki ishlatishni boshlagan ushbu vosita haqida ozgina ma'lumot bersak foydadan holi bo'lmaydi. Demak boshladik:

uv bu Rust dasturlash tilida yozilgan, pip, venv, piptools va boshqa shunga o'xshash kutubxonlarning o'rnini bosa oladigan python kutubxonasidir.

Uning eng asosiy afzalligi tezlik bo'lib, pip dan 100 karragacha tezroq ishlashi mumkin.

Ha, tushunganingizdek butun dunyo pip install dan voz kechib uv add ga kamida uv pip install ga o'tmoqda.

Tezlikdan tashqari, uv ancha qulayhamdir.
Masalan, biz o'rgangan pip, venv dan foydalanib biron loyiha yaratishda avval venv yordamida virual muhit yaratiladi, pip install yordamida kerakli kutubxonalar qo'shiladi, requirements.txt to'ldirilib boriladi va hokazo.

uv
yordamida esa:

uv init .
uv add <package_name>


va hammasi tayyor! pyproject.toml fayli orqali barcha kutubxonalar ro'yxati yuritiladi. Kutubxonalarni ushbu faylga yozib/o'chirib uv sync buyrug'i yozilsa, kutubxonalar avtomatik o'rnatiladi/o'chiriladi.

Bundan tashqari, uv da loyiha uchun alohida, bitta script uchun alohida yondashuv qilingan.
Qisqa qilib aytganda juda qulay.

Quyida ushbu vositani foydalanish uchun asosiy buyruqlar keltirilgan:

Python versiyasini o'rnatish:

uv python install 3.8

Scriptni ishga tushirish:

uv run main.py

Scriptni ishga tushirishda python versiyani belgilash:

uv run —python 3.9.21 main.py

Scriptni ishga tushirishda biron kutubxonani (ushbu buyruqda rich va requests) o'rnatib ishga tushirish:

uv run —with rich —with requests —python 3.9 main.py

Scriptni ishga tushirishda kerak bo'ladigan python versiya hamda kutubxonlarni scriptning o'zida belgilab qo'yish:

uv init —script main.py —python 3.9.21
uv add —script
main.py "rich"
uv add —script
main.py "requests"

Faqat bitta script emas, Loyiha boshqaruvi uchun buyruqlar:

uv init . # Kerakli fayllarni yaratadi.

uv add rich
# rich kutubxonasini venv direktoriyasiga o'rnatadi hamda pyproject.toml ni yangilaydi

uv remove rich
# rich rich kutubxonasini venv direktoriyasidan o'chiradi hamda pyproject.toml ni yangilaydi

uv sync
# pyproject.toml, .python-version bilan venv o'rtasida sinxronizatsiyani amalga oshiradi.

Boshqa ma'lumotlarni quyidagi havola orqali ko'rib olishingiz mumkin.

Izohlarda fikringizni qoldiring, foydali deb hisoblasangiz boshqalarga ham ulashishni unutmang.

Kuningiz xayrli o'tsin!

@simplypythonuz
👍31
🔍 Python'dagi difflib — matnlar o‘rtasida o‘xshashlikni topish!

Python juda foydali bo‘lgan difflib kutubxonasini taqdim etadi. U orqali matnlardagi o‘xshashliklarni topish mumkin — ayniqsa, so‘zlar orasidan eng yaqinlarini tanlash kerak bo‘lsa, juda qulay.

📘 Misol:

import difflib

words = ["apple", "ape", "appeal", "par", "parade"]

print(difflib.get_close_matches("appel", words))
# ➝ ['appeal', 'apple', 'ape']


🔎 "appel" so‘ziga eng o‘xshashlari qaytarildi. Bu difflib.get_close_matches() funksiyasi orqali bo‘ldi.

Yana misollar:

print(difflib.get_close_matches("pa", words))
# ➝ ['par']

print(difflib.get_close_matches("par", words))
# ➝ ['par', 'parade']

"parade" boshlanishi "par" ga o‘xshaganligi sababli chiqarildi.

🚀 Juda oddiy, lekin kuchli vosita!

https://t.me/simplypythonuz
👍4
⏱️ Python'da mikrosekundgacha aniqlik — datetime.strptime() bilan!

Agar siz loglar, metrikalar yoki vaqt qatorlari bilan aniq vaqt bilan ishlayotgan bo‘lsangiz, datetime.strptime() metodida "%f" formatini unutmang!

📌 Misol:

from datetime import datetime

dt = datetime.strptime('2024-06-18 12:34:56.789123', '%Y-%m-%d %H:%M:%S.%f')
print(dt)  # ➝ 2024-06-18 12:34:56.789123


📅 Formatlar:

%Y — yil (4 raqam)
%m — oy
%d — kun
%H — soat (24 soatlik format)
%M — daqiqa
%S — soniya
%f — mikrosekund ⚡️

🧠 Bu — vaqtni yuqori aniqlikda tahlil qilishda ayni muddao!

https://t.me/simplypythonuz
👍1
🧊 Lug‘atdan xavfsiz qiymat olish — .get() yordamida!

Ba'zida lug‘atdan (dict) qiymat olish kerak bo‘ladi, lekin kalit mavjud emas bo‘lishi mumkin. Bunday hollarda if yozib tekshirish o‘rniga — .get() metodidan foydalaning

📌 Misol:

data = {"name": "Ali"}

# Xavfsiz tarzda qiymat olish
age = data.get("age", 0) # Agar "age" yo‘q bo‘lsa, 0 qaytadi


🚫 data["age"] — bu xatolik beradi, agar kalit yo‘q bo‘lsa.
data.get("age", 0) — xatolik bo‘lmaydi, default qiymat qaytadi.

🎯 Natija:
.get() metodi kodni toza, xavfsiz va o‘qilishi oson qiladi — ayniqsa ixtiyoriy yoki noma'lum ma'lumotlar bilan ishlaganda!

https://t.me/simplypythonuz
🧠 getweakrefcount() — ob’yektga nechta “zaif havola” bor?

Python’dagi weakref.getweakrefcount() funksiyasi — ob’yektga bog‘langan barcha zaif havolalar (weak references) va proksi obyektlar sonini qaytaradi.

🔧 Sintaksis:

import weakref

weakref.getweakrefcount(obj)

📥 Parametr:

obj — tekshirilayotgan ob’yekt.

📤 Natija:


int — ob’yektga bog‘langan zaif havola va proksi obyektlar soni.

📌Qachon foydali?
Agar siz xotirani boshqarish, obyektlarga “noan’anaviy” usulda havola qilish, yoki garbage collector bilan ishlayotgan bo‘lsangiz — bu funksiya ayni kerakli narsa!

getweakrefcount() haqida batafsil quyidagi yopiq kanalda:
yopiq kanal: https://t.me/+G8Ao2nlAzBQ0ZGIy
yopiq kanaldagi post: https://t.me/c/2447128954/10

Garbage collector haqida batafsil quyidagi yopiq kanalda:
yopiq kanal: https://t.me/+G8Ao2nlAzBQ0ZGIy
yopiq kanaldagi post: https://t.me/c/2447128954/12

Zaif havola haqida batafsil quyidagi yopiq kanalda:
yopiq kanal: https://t.me/+G8Ao2nlAzBQ0ZGIy
yopiq kanaldagi post: https://t.me/c/2447128954/11

https://t.me/simplypythonuz
🔥1
🛑 for/elsesiklni to‘xtatish va “muvaffaqiyatli tugash”ni ajratish
Ko‘pchilik bilmaydi: Python’da for va while sikllari else bloki bilan ishlashi mumkin!

🧩 Bu else faqat sikl break bilan to‘xtatilmagan bo‘lsa, ishga tushadi.

📘 Misol:

nums = [2, 4, 6, 8]

for n in nums:
if n % 2 != 0:
print("Toq son topildi!")
break
else:
print("Barcha sonlar juft.")


🟢 Agar toq son topilsa — break bilan chiqiladi va else ishlamaydi.
🔵 Aks holda — sikl oxirigacha “tabiiy” tugasa, else ishlaydi.

🎯 Natija:
for/else orqali siz:

Qidiruv muvaffaqiyatli tugaganmi yoki yo‘qmi — farqlay olasiz
Valdatsiya, test, yoki filtrlash holatlarini aniq ko‘rsatishingiz mumkin
Kodni yanada tartibli va tushunarli qilasiz

❗️ Juda kam ishlatiladi, lekin foydali imkoniyat!

https://t.me/simplypythonuz
🔗 ChainMap — bir nechta lug‘atni bitta ko‘rinishda boshqarish!
Python’dagi collections modulidagi ChainMap — bu bir nechta dict (lug‘at) obyektini bitta birlashtirilgan ko‘rinishda boshqarish imkonini beradi.

🧠 Bu ayniqsa quyidagi holatlarda juda foydali:

🔄 Turli darajadagi konfiguratsiyalar (masalan: default + user config)
📦 Har xil kontekstlar yoki sohalar (scope)
📋 Bir nechta dict ni prioritet asosida izlash

📘 Misol:

from collections import ChainMap

default = {'lang': 'uz', 'theme': 'light'}
user = {'theme': 'dark'}

config = ChainMap(user, default)

print(config['theme']) # ➝ dark (user'ning qiymati ustun)
print(config['lang']) # ➝ uz (defaultdan olindi)


🧩 ChainMap birinchi lug‘atdan boshlab qidiradi, topmasa keyingisiga o‘tadi.
➡️ Tartib = ustuvorlik!

🎯 Foyda:
Kod ancha soddalashadi
Qo‘lda birlashtirish yoki update() qilishga hojat qolmaydi
Har bir dict asl holicha saqlanib qoladi — hech nima o‘zgarmaydi

🛠 ChainMap — ko‘p lug‘atli holatlarda toza va tartibli yechim!

https://t.me/simplypythonuz
🧮 Fayl tizimidagi disk hajmini aniqlash: statvfs() va muqobillari
Python’da fayl tizimi haqida ma’lumot olish uchun os.statvfs() funksiyasi ishlatiladi, lekin...

🛑 Xatolik:
Agar siz Windows tizimida bo‘lsangiz va quyidagi kodni yozsangiz:

import os
stat = os.statvfs('D:/')

Quyidagi xato chiqadi:


AttributeError: module 'os' has no attribute 'statvfs'

📌 Sabab: os.statvfs() faqat UNIX (Linux/macOS) tizimlarda mavjud.
Windows’da bu funksiya umuman mavjud emas.

Kross-platformali yechim: shutil.disk_usage()
Windows va Linux’da ishlaydigan universal usul:

import shutil

total, used, free = shutil.disk_usage("D:/")

print(f"Umumiy hajm: {total / (1024**3):.2f} GB")
print(f"Ishlatilgan: {used / (1024**3):.2f} GB")
print(f"Bo‘sh joy: {free / (1024**3):.2f} GB")

🟢 Har bir operatsion tizimda ishlaydi
🧠 Natijalar bayt birligida qaytadi → GB ga o‘girib ko‘rsatamiz

💡 Qo‘shimcha: psutil bilan qulay yechim
Agar siz yanada batafsil statistikani xohlasangiz, psutil kutubxonasini o‘rnatib foydalaning:


pip install psutil


import psutil

disk = psutil.disk_usage("D:/")
print(f"Bo‘sh joy: {disk.free / (1024**3):.2f} GB")


🎯 Xulosa:
Usul - Platforma - Tavsiya
os.statvfs() - Linux/macOS - UNIX tizimlarida ishlaydi
shutil.disk_usage() - Har doim - Kross-platformali va oddiy
psutil.disk_usage() - Har doim - Ko‘proq imkoniyatli


https://t.me/simplypythonuz
1
#masala #leetcode #explanition #med. #pythonadvanced

Quyida leetcode dagi 3 - masala, yechimi tushuntirilgan
(bu mening yechimim va eng optimal yechim bo'lmasligi mumkin)

3. Longest Substring Without Repeating Characters
masala sharti: s satr berilgan (string turidagi o'zgaruvchi), s satr ichidagi birorta belgi takrorlanmagan eng uzun qism satr uzunligini toping.

masala yechimi:
class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
left_position = 0
substring_finding = set()
substring_length = 0
for right_position in range(len(s)):
while s[right_position] in substring_finding:
substring_finding.remove(s[left_position])
left_position += 1
substring_finding.add(s[right_position])
substring_length = max(substring_length, len(substring_finding))
return substring_length


masala tahlili:
Bir qarashda oddiy misoldek tuyulishi mumkin, va aytishingiz mumkin oddiy ichma-ich for orqali yechish mumkin deb, lekin bu holda vaqt murakkabligi oshib ketadi. Dastur bajarilishiga ketgan vaqt meyoridan oshib testdan o'ta olmaydi.
Yuqoridagi yechim esa vaqt meyori talablariga ham javob beradi.

Yechimning g'oyasi:
Tasavvur qilaylik biz izlagan qism satr berilgan s satrning qaysidir qismida joylashgan va u albatta s satrning qaysidir pozitsiyasidan (left_position) boshlanib qaysidir positsiyasida (right_position) tugaydi. Biz bu o'zgaruvchilarga boshlang'ich qiymat nolni o'zlashtiramiz (biz izlashni s satrning boshidan boshlaganimiz uchun boshlang'ich left_position ga nol qiymat beramiz),

shuningdek, bizga pustoy s satr berilishi mumkinligini ham inobatga olib substring_length ga ham nol qiymat bervolamiz.

substring_finding ni takrorlanuvchi elementga ega bo'lmagan tur set() deb e'lon qilamiz (biz izlagan qism satrni o'zi mavjud bo'lmasligini ham inobatga olgan holda u ham boshlanishida bo'sh bo'ladi) .

bittalik for sikli orqali biz berilgan s satrdan boshidan boshlab bittadan harfni substring_finding ga qo'shib boramiz,

lekin qachonki biz qo'shmoqchi bo'lgan belgi substring_finding tarkibida bor bo'lsa (while siklining ichi) (bu biz qidirayotgan qism satr talabiga mos kelmaydi chunki biz tarkibida takrorlanuvchi belgi bo'lmagan qism satr qidiryapmiz) substring_finding tarkibidagi shu belgi o'chib ketmaguncha substring_finding ning birinchi elementini (s satrning left_position pozitsiyasida turgan elementi s[left_position] ni) o'chiramiz va left_position qiymatini keyingi belgi pozitsiyasiga o'zgartirib qo'yamiz (left_position +=1).

Shunday qilib for siklining har bir siklida hosil bo'lgan qism satr ( substring_finding ) ning uzunligini shu vaqtgacha topilgan eng uzun uzunlik bilan solishtirib turamiz va uzunrog'i topilsa yangi uzunlikni o'zlashtiramiz
(
substring_length = max( substring_length, len( substring_finding)
)

Boshlovchilar uchun yopiq kanalimiz:
https://t.me/+4-HzPYPUWWw3NDEy

Python bo'yicha ozroq tajriba ega bo'lganlar uchun yopiq kanal:
https://t.me/+G8Ao2nlAzBQ0ZGIy

Leetcode masalalari bo'yicha:
https://t.me/+x2ag7zS70DQyMjJi

https://t.me/simplypythonuz