Gần đây mình mới nhảy sang vọc Python, vì bản tính tò mò nên mình hay đi tìm những trick hay của ngôn ngữ đó =)) Nên hôm nay mình sẽ liệt kê ra những thứ hay ho mình tìm đc dưới con mắt một thanh niên Ruby nhảy sang :3
else kết đôi với for ????
Mọi người đã bao giờ thấy else đi với vòng lặp for bao giờ chưa ạ =)) Thế mà Py nó có có một loại cú pháp đặc biệt chỉ thực thi nếu vòng lặp for thoát tự nhiên mà không có bất kỳ câu lệnh ngắt nào.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | <span class="token keyword">def</span> <span class="token function">func</span><span class="token punctuation">(</span>array<span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token keyword">for</span> num <span class="token keyword">in</span> array<span class="token punctuation">:</span> <span class="token keyword">if</span> num<span class="token operator">%</span><span class="token number">2</span><span class="token operator">==</span><span class="token number">0</span><span class="token punctuation">:</span> <span class="token keyword">print</span><span class="token punctuation">(</span>num<span class="token punctuation">)</span> <span class="token keyword">break</span> <span class="token comment"># Case1: Break được gọi nên đoạn mã trong else sẽ ko đc thực thi. </span> <span class="token keyword">else</span><span class="token punctuation">:</span> <span class="token comment"># Case 2: Else đc thực thi vì ko có thằng break nào </span> <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">"No call for Break. Else is executed"</span><span class="token punctuation">)</span> <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">"1st Case:"</span><span class="token punctuation">)</span> a <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span> func<span class="token punctuation">(</span>a<span class="token punctuation">)</span> <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">"2nd Case:"</span><span class="token punctuation">)</span> a <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span> func<span class="token punctuation">(</span>a<span class="token punctuation">)</span> |
Kết quả của function trên:
1st Case:
2
2nd Case:
No call for Break. Else is executed
Giải nén biến :3
Chức năng Argument Unpacking (giải nén biến) là một tính năng tuyệt vời khác của Python. Chúng ta có thể giải nén một List hoặc một Dictionary để dùng như một biến số bằng cách sử dụng * và ** . Điều này thường được gọi là toán tử Splat. Ví dụ ở đây:
1 2 3 4 5 6 7 8 9 | <span class="token keyword">def</span> <span class="token function">point</span><span class="token punctuation">(</span>x<span class="token punctuation">,</span> y<span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token keyword">print</span><span class="token punctuation">(</span>x<span class="token punctuation">,</span>y<span class="token punctuation">)</span> foo_list <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">4</span><span class="token punctuation">)</span> bar_dict <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token string">'y'</span><span class="token punctuation">:</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token string">'x'</span><span class="token punctuation">:</span> <span class="token number">2</span><span class="token punctuation">}</span> point<span class="token punctuation">(</span><span class="token operator">*</span>foo_list<span class="token punctuation">)</span> <span class="token comment"># Giải nén Lists </span> point<span class="token punctuation">(</span><span class="token operator">**</span>bar_dict<span class="token punctuation">)</span> <span class="token comment"># Giải nén Dictionaries </span> |
Output:
3 4
2 3
Tìm index trong loop
Việc này khá đơn giản, nhưng ko như Ruby có hàm each_with_index với một cái tên chỉ rõ chức năng của nó =)) Py có hàm tương ứng ‘enumerate’ mà cái tên nó ko liên quan cho lắm =,.,= Nói chung nó cũng trả về một phần tử của vòng lặp đi kèm với index của nó:
1 2 3 4 | vowels<span class="token operator">=</span><span class="token punctuation">[</span><span class="token string">'a'</span><span class="token punctuation">,</span><span class="token string">'e'</span><span class="token punctuation">,</span><span class="token string">'i'</span><span class="token punctuation">,</span><span class="token string">'o'</span><span class="token punctuation">,</span><span class="token string">'u'</span><span class="token punctuation">]</span> <span class="token keyword">for</span> i<span class="token punctuation">,</span> letter <span class="token keyword">in</span> <span class="token builtin">enumerate</span><span class="token punctuation">(</span>vowels<span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token keyword">print</span> <span class="token punctuation">(</span>i<span class="token punctuation">,</span> letter<span class="token punctuation">)</span> |
Output:
(0, ‘a’)
(1, ‘e’)
(2, ‘i’)
(3, ‘o’)
(4, ‘u’)
To infinity and beyond !!! and back ??
Chúng ta có thể định nghĩa được vô cực phải không? Nhưng chờ đã! Không phải với Python. Hãy xem ví dụ tuyệt vời này:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | <span class="token comment"># Dương vô cực</span> p_infinity <span class="token operator">=</span> <span class="token builtin">float</span><span class="token punctuation">(</span><span class="token string">'Inf'</span><span class="token punctuation">)</span> <span class="token keyword">if</span> <span class="token number">99999999999999</span> <span class="token operator">></span> p_infinity<span class="token punctuation">:</span> <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">"The number is greater than Infinity!"</span><span class="token punctuation">)</span> <span class="token keyword">else</span><span class="token punctuation">:</span> <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">"Infinity is greatest"</span><span class="token punctuation">)</span> <span class="token comment"># Âm vô cực</span> n_infinity <span class="token operator">=</span> <span class="token builtin">float</span><span class="token punctuation">(</span><span class="token string">'-Inf'</span><span class="token punctuation">)</span> <span class="token keyword">if</span> <span class="token operator">-</span><span class="token number">99999999999999</span> <span class="token operator"><</span> n_infinity<span class="token punctuation">:</span> <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">"The number is lesser than Negative Infinity!"</span><span class="token punctuation">)</span> <span class="token keyword">else</span><span class="token punctuation">:</span> <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">"Negative Infinity is least"</span><span class="token punctuation">)</span> |
Output:
Infinity is greatest
Negative Infinity is least
Slice Operator
Python’s có một thứ đặc biệt gọi là Slice Operator. Thực ra nó chỉ là tập hợp những cách màu mè để lấy ra các mục từ danh sách, cũng như thay đổi chúng. Hãy xem đoạn mã này:
1 2 3 4 5 6 7 8 9 10 11 12 13 | <span class="token comment"># Slice Operator </span> a <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">,</span><span class="token number">2</span><span class="token punctuation">,</span><span class="token number">3</span><span class="token punctuation">,</span><span class="token number">4</span><span class="token punctuation">,</span><span class="token number">5</span><span class="token punctuation">]</span> <span class="token keyword">print</span><span class="token punctuation">(</span>a<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">:</span><span class="token number">2</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token comment"># Lấy phần tử từ 0 đến 2 nhưng ko lấy 2 (yaoming)</span> <span class="token keyword">print</span><span class="token punctuation">(</span>a<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">:</span><span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token comment"># Lấy hết trừ thanh niên cuối hàng</span> <span class="token keyword">print</span><span class="token punctuation">(</span>a<span class="token punctuation">[</span><span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token comment"># Đảo ngược list</span> <span class="token keyword">print</span><span class="token punctuation">(</span>a<span class="token punctuation">[</span><span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token number">2</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token comment"># Bỏ qua 2 phần tử đầu</span> <span class="token keyword">print</span><span class="token punctuation">(</span>a<span class="token punctuation">[</span><span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token operator">-</span><span class="token number">2</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token comment"># Bỏ 2 phần tử cuối </span> |
Output:
[1, 2]
[1, 2, 3, 4]
[5, 4, 3, 2, 1]
[1, 3, 5]
[5, 3, 1]
Có giải nén thì phải có nén chứ nhỉ (2 cái ko liên quan đến nhau đâu =)))))
Muốn nén hai List thành 1 ma trận 2 chiều. Chỉ cần sử dụng zip để làm điều đó.
1 2 3 | matrix <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token punctuation">[</span><span class="token number">4</span><span class="token punctuation">,</span> <span class="token number">5</span><span class="token punctuation">,</span> <span class="token number">6</span><span class="token punctuation">]</span><span class="token punctuation">]</span> <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token builtin">zip</span><span class="token punctuation">(</span><span class="token operator">*</span>matrix<span class="token punctuation">)</span><span class="token punctuation">)</span> |
Kết quả (thử dùng giải nén xem có ra gì ko nhá):
[(1, 4), (2, 5), (3, 6)]
Khai báo function tại chỗ (wow)
Bạn muốn khai báo một function nhỏ, nhưng bạn không muốn kéo xuống và khai báo nó ở dưới. Đừng lo, bạn có thể sử dụng lambda. Từ khóa lambda trong python dùng để khai báo hàm ẩn danh, bạn có thể khai báo function mọi lúc mọi nơi mà ko ngại bố con thằng nào =)) (đùa đấy khai báo mấy hàm nhỏ gọn thui nhá :v)
1 2 3 | subtract <span class="token operator">=</span> <span class="token keyword">lambda</span> x<span class="token punctuation">,</span> y <span class="token punctuation">:</span> x<span class="token operator">-</span>y subtract<span class="token punctuation">(</span><span class="token number">5</span><span class="token punctuation">,</span> <span class="token number">4</span><span class="token punctuation">)</span> |
Lặp String N lần
Bình thường ở những ngôn ngữ khác để làm việc này chúng ta sẽ sử dụng vòng lặp, nhưng python có một thủ thuật đơn giản liên quan đến một chuỗi và một số bên trong chức năng print. (Tưởng gì chứ Ruby cũng có)
1 2 3 | <span class="token builtin">str</span> <span class="token operator">=</span><span class="token string">"Point"</span><span class="token punctuation">;</span> <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token builtin">str</span> <span class="token operator">*</span> <span class="token number">3</span><span class="token punctuation">)</span><span class="token punctuation">;</span> |
Output:
PointPointPoint
Mình mới bắt đầu học nên mới chỉ tìm hiểu cái hay của ngôn ngữ, lần sau mình sẽ trở lại và lợi hại hơn với những điểm hay của framework Django. Rất cảm ơn mọi người đã đọc bài viết của mình (bow)