khafan2.py

به قسمت دوم از میونبر های پایتونی خوش اومدین. اینجا قراره هر نکته جالب و کاربردی که به عنوان یه دانش آموز تو پایتون یاد می‌گیرم رو بنویسم تا بمونه؛ هم واسه خودم هم واسه خودتون :) قسمت اول اینجا هست.




1. برعکس کردنِ یه رشته/لیست/عدد:

از slicing استفاده می‌کنیم! این روش در کل انتخاب یه بخشی از یه رشته هست و اینطوریه که سه تا پارامتر داره که با علامت ":" از هم جدا می‌شن. پارامتر به ترتیب می‌پرسن: از کجا شروع شه؟ کجا تموم شه؟ چندتا چندتا بره جلو؟

اول دوتا پارامتر اول رو می‌گم تا برسیم به سومی.

اولین خونه با صفر مشخص می‌شه، اما اگه خالی بذاریم دیفالت مساوی صفر قرار می‌گیره. یعنی a[0:5] = a[:5] هست.

آخرین خونه هم با -1 مشخص می‌شه و ایندکسِ کاراکترای قبلیش همینجوری کم می‌شه(برعکسِ پیمایش جلو به عقب که یکی یکی زیاد می‌شه). اینجا هم اگه دومین پارامتر خالی باشه دیفالت مساوی -1 قرار داده می‌شه. یعنی a[2:-1] = a[2:]

مثلا اگه داشته باشیم 'a = 'virgool داریم:

a[:] = 'virgool'
a[:3] = a[0:3] = 'virg'
a[2:] = a[2:] = 'gool'

بدیهیه که خونه آخر برابر با المانِ "طول رشته - 1" اُم رشته هم هست. یعنی داریم:

a[len(a) - 1] = a[-1] = 'l' (L, not i)

اگه تا اینجا مفهوم بوده که خوبه، اگه نه یه بار دیگه چند خطِ بالا رو بررسی کنین; کامنت ها هم هست :)

حب بریم سراغ پارامتر سوم که "چندتا چندتا بره جلو؟" بود. تو حالت عادی یکی یکی می‌ره جلو، پس اگه خالی باشه دیفالت مساوی 1 هست. اما داریم:

a[::2] = 'vrol' #elements: 0, 2, 4, 6

این پارامتر هم مثل قبلیا می‌تونه برعکس شه. یعنی تو مثال بالا اگه به جای 2، -2 بذاریم به جای اینکه 2تا 2تا "جلو بره"، این دفعه 2تا 2تا "عقب می‌آد". پس داریم:

a[::-2] = 'lorv'

تا الان باید حدس زده باشین چطور یه رشته رو می‌شه برعکس کرد :)

جواب اینه که پارامتر سومش رو منفی کنیم! پس:

a = 'virgool'
a[::-1] = 'loogriv'

نکته درباره اعداد هم فقط تبدیلشون به استرینگ، منفی کردن پارامتر سوم (step)، و دوباره تبدیلش کردن به عدد:

a_number = 05041994
int(str(a_number)[::-1]) = 49914050

یه راه دیگه هم واسه این کار هست و اونم پیشمایشِ نسخه ی برعکس شده ی رشته/لیست هست. یعنی:

a_list = ['05', '04', '1994']
for item in reversed(a_list):
    print(item, end=' ')

هرچند خیلی ها توصیه می‌کنن از enumerate استفاده کنین(از جمله خود داکس پایتون)، ما هم می‌گیم چشم :)

for item in enumerate(reversed(a_list)):
    print(item, end=' ')
In most cases,  however, it is convenient to use the enumerate() function.
In most cases, however, it is convenient to use the enumerate() function.

2. ترانهاده ی یه ماتریس:

اگه ماتریس scores رو داشته باشیم و ترانهاده اش رو بخوایم، می‌تونیم بنویسیم:

scores = [[10, 10, 20, 8, 5], [1, 2, 3, 4, 5]] #5*2

حالا اگه بخوایم نمره های خارق العاده دو ترم پیشم رو ببینین باید بنویسین: (البته هیچکس دوست نداره قطعا؛ مخصوصا خودم)

mashroot = list(zip(*scores))

البته اگه دوست دارین می‌تونین با numpy کارتون رو کم کنین؛ به این شکل که:

import numpy as np
mashroot = scores.T #capital T :D

خب اینم پارت دو؛ تا دفعه بعد خدانگهدار. سعی کنین امروز مثل دیروز نباشه :)