---
# System prepended metadata

title: Python 特性入門
tags: [python]

---

Python 特性入門
===
###### tags: `python`
## Abstract
![Quick Python Script Explanation for Programmers](http://i.imgur.com/YQafj.png)

為了方便各位能trace code並且寫出自己的code.
我們必須先對python的特殊語法熟悉一下.
### 0x0. Slice 要怎麼使用舉個例子
### 0x1. list comprehension ? 舉例說明
```python
squares = [x**2 for x in range(10)]

print squares
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
```
### 0x2. range() 跟 xrange()差在哪? 舉例說明
### 0x3. with 用在哪? 用了有甚麼好處? 舉例說明(open file?)
### 0x4. lambda? 是甚麼?  舉例用法
### 0x5. map, filter and reduce 舉例用法
### 0x6. `*args` 和 `**kwargs` 幹嘛用的?
### 0x7. 甚麼是生成器? 有甚麼優點?
https://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/00138681965108490cb4c13182e472f8d87830f13be6e88000
### 0x8. yield 怎用? 試用他寫個費氏數
* yield 是個進階版的return。
```python=
def fibonacci_generator():
    a, b = 0, 1
    while True:
        yield a
        a, b = b, a + b

# 创建一个斐波那契数列生成器对象
fib_gen = fibonacci_generator()

# 打印前10个斐波那契数
for i in range(10):
    print(next(fib_gen))
```
### 0x9. (for debug) isinstance, type 如何用?

```python=
import threading, time, logging, fastcounter

logging.basicConfig(level=logging.DEBUG,
                    format='(%(threadName)-9s) %(message)s',)

counter = fastcounter.Counter()
def job(num, e):
    
    global counter
    counter.increment()
    # to-do : logging the hall
    e.wait()
    # to-do: playing the game
if __name__ == '__main__':
    maxconnections = 5
    e = threading.Event()
    threads = []
    for i in range(maxconnections):
        threads.append(threading.Thread(name=str(i)+'-th thread' ,target=job, args=(i, e)))
        threads[i].start()

    while counter.value < maxconnections:
        pass
        
    e.set()
    
    for i in range(5):
        threads[i].join()

    logging.debug("Done.")     
```
### 0x10. copy() vs deepcopy()
* 当你需要复制一个列表（或其他可变对象）而不影响原始列表时，可以使用 Python 中的 copy() 方法。这个方法创建一个浅拷贝，也就是复制了原始列表的引用，但不复制其内部的嵌套对象。：
```python3=
  original_list = [1, 2, 3, [4, 5]]

# 使用 copy() 方法创建一个新的列表
new_list = original_list.copy()

# 修改新列表中的元素
new_list[0] = 10
new_list[3][0] = 40
 
# 打印结果
print("原始列表:", original_list)
print("新列表:", new_list)
#原始列表: [1, 2, 3, [40, 5]]
#新列表: [10, 2, 3, [40, 5]]
  ```
## 安全問題
* [Exploiting Eval(), Exec(), input](https://www.stackhawk.com/blog/command-injection-python/)
* [Exploiting Python Code Injection in Web Applications](https://sethsec.blogspot.com/2016/11/exploiting-python-code-injection-in-web.html)
## 編碼相關

### [Windows 系統上 Python 的文字輸出編碼](https://hackmd.io/@meebox/rJXWIi5p_#Windows-%E7%B3%BB%E7%B5%B1%E4%B8%8A-Python-%E7%9A%84%E6%96%87%E5%AD%97%E8%BC%B8%E5%87%BA%E7%B7%A8%E7%A2%BC)

```python=
# print_encoding.py
import sys
import locale

print('locale.getpreferredencoding():\t{}'.format(
  locale.getpreferredencoding())
)
print('sys.getfilesystemencoding():\t{}'.format(
  sys.getfilesystemencoding())
)
print('sys.getdefaultencoding():\t{}'.format(
  sys.getdefaultencoding())
)
print('sys.stduot.encoding:\t\t{}'.format(
  sys.stdout.encoding)
)
```

## misc
### iterators vs generators
https://foofish.net/iterators-vs-generators.html
### virtualenv
virtualenv 可以隔離許多python環境, 方便各種python應用.
### 有没有简单一点的Python小例子小项目？
https://www.zhihu.com/question/51920544/answer/128132480
### Python有GIL为什么还需要线程同步？
https://www.zhihu.com/question/23030421/answer/36220770
### Python暴力猜解Web应用
https://zhuanlan.zhihu.com/p/23394446