Python Advance

講者:黃丰嘉

What is Python ?

Python 是一通用、直譯、物件導向的高階程式語言。

https://kknews.cc/news/nkkr3j3.html

腳本語言

直譯

vs.

編譯

1. 通用:撰寫任何工作的程式碼

2. 直譯:直譯器轉譯與執行(一次一行)

3. 物件導向:有利於開發可重複的軟體

# trips/models.py

from django.db import models

class Post(models.Model):
    title = models.CharField(max_length=100)
    content = models.TextField(blank=True)
    photo = models.URLField(blank=True)
    created_at = models.DateTimeField(auto_now_add=True)

Python 2.7 v/s 3.7

  • Python 2.7 將於 2020年停止維護

  • 兩者互不相容

  • Python 3.x    --- Cleaner and faster!

撰寫Python

一定要注意的事!

  • Indentation aware

縮排!縮排!縮排!

Comments 註解

單行註解
#This is a comment.    

多行註解
"""This is a
multiline docstring."""    

'''This is a
multiline docstring.'''

Variables Names

變數命名

  • A variable can have a short name (like x and y) or a more descriptive name (age, carname, total_volume).
  • Rules for Python variables:
    • 開頭:不能為數字
    • 使用 A-z, 0-9, and _ 命名 (底線 underscore)
    • 駝峰式大小寫 Case-sensitive
    • Python 會辨別大小寫
this_is_a_number = 1

ThisIsANumber = 1

保留字 (Reserved Word)

請不要使用以下保留字命名!

>>> import keyword

>>> keyword.kwlist

['False', 'None', 'True', 'and', 'as', 'assert', 'break', 'class',
 'continue', 'def', 'del', 'elif', 'else', 'except', 'finally', 'for',
 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'nonlocal', 'not',
 'or', 'pass', 'raise', 'return', 'try', 'while', 'with', 'yield']

 exit() 離開 python 回到 cmd

Numbers 數字

  • Three numeric types in Python:
    • int
    • float
    • complex
x = 1        # int
y = 2.8      # float
z = 3+5j     # complex

>>> x=1.23
>>> type(x)
<class 'float'>

Specify a Variable Type

強制轉換型別

  • int()
  • float()
  • str()
a = int(2.8)     # a will be 2
x = float(1)         # x will be 1.0
z = float("3")       # z will be 3.0
w = float("4.2")     # w will be 4.2
y = str(2)        # y will be '2'
z = str(3.0)      # z will be '3.0' 


>>> print('哈囉'+123)

>>> print('哈囉')
哈囉

>>> print('哈囉'+str(123))
哈囉123

Strings 字串

a = "Hello, World!"
print(a[1])              #e
print(a[2:5])            #llo
print(len(a))            #13
print(a.lower())             #hello, world!
print(a.upper())             #HELLO, WORLD!
print(a.replace("H", "J"))        #Jello, World!

>>> a = "Hello, World!"
>>> print(a.split(","))        #['Hello', ' World!']
>>> b = a.split(",")
>>> type(b)                    #<class 'list'>

a = " Hello, World! "
print(a.strip())     #"Hello, World!" 去掉前後的空白

Operators

運算子

Arithmetic operators

算術運算子

  • 加 +       減 -       乘 *

  • 除法

    • /  (浮點數除法)

      • 4/2 輸出結果為 2.0

    • // (整數除法)

      • 9//5 輸出結果為 1

  • 次方 **

    • 2**3 輸出結果為 8

  • 取餘數 %

    • 7%5 輸出結果為 2

賦值運算子 名稱 範例 相當於
+= 加法指定 i+=8 i=i+8

Comparison Operators

比較運算子

  • 等於 ==

  • 不等於 !=

  • 大於 >

  • 小於 <

  • 大於等於 >=

  • 小於等於 <=

Logical Operators

邏輯運算子

  • and

  • or

  • not

>>> x = 5

>>> print(x > 3 and x < 10)

>>> print((x > 10) or (x % 2 == 0))

>>> print(not(x > 3 and x < 10))

#補充:Identity Operators

  • is

  • is not

x = ["apple", "banana"]
y = ["apple", "banana"]
z = x

print(x is z)    # True because z is the same object as x

print(x is y)    # False because x is not the same object as y, 
                    even if they have thew same content

print(x == y)    # True because x is equal to y

# the difference betweeen "is" and "==": 
    is -> 參考到同一個櫃子
    == -> 內容相同

#補充:Membership Operators

  • in

  • not in

x = ["apple", "banana"]

print("banana" in x)

# returns True 
because a sequence with the value "banana" is in the list

#先不管

Bitwise Operators

賦值運算子 名稱 範例 相當於
&= AND x &= 3 x = x & 3
|= OR x |= 3 x = x | 3
^= XOR x ^= 3 x = x ^ 3
>>= Signed right shift x >>= 3 x = x >> 3
<<= Zero fill left shift x <<= 3 x = x << 3
~ NOT

https://www.w3schools.com/python/python_operators.asp

資料結構

資料結構

  • List is a collection which is ordered and changeable.
    • Allows duplicate members.
  • Tuple is a collection which is ordered and unchangeable.
    • Allows duplicate members.
  • Set is a collection which is unordered and unindexed.
    • No duplicate members.
  • Dictionary is a collection which is unordered, changeable and indexed.
    • No duplicate members.

List

  • List is a collection which is ordered and changeable.
    • Allows duplicate members.
    • method: append(), insert(),remove(), reverse(), sort(), pop()...
thislist = ["apple", "banana", "cherry"]
thislist[1] = "blackcurrant"
print(thislist)

thislist = ["apple", "banana", "cherry"]
for x in thislist:
  print(x)

thislist = ["apple", "banana", "cherry"]
thislist.insert(1, "orange")
print(thislist)

Tuple

  • Tuple is a collection which is ordered and unchangeable.
    • Allows duplicate members.
thistuple = ("apple", "banana", "cherry")
thistuple[1] = "blackcurrant"

print(thistuple)        
# the value is still the same.

Set

  • Set is a collection which is unordered and unindexed.
    • No duplicate members.
    • method: add(), update(), len(), discard(), pop()...
thisset = {"apple", "banana", "cherry"}

thisset.add("orange")    
# add one item

thisset.update(["orange", "mango", "grapes"])    
# add more than one item

Dictionary

  • Dictionary is a collection which is unordered, changeable and indexed.
    • No duplicate members.
    • method: get(), items(), pop()...
thisdict = { "brand": "Ford", "model": "Mustang", "year": 1964 }

x = thisdict["model"]
y = thisdict.get("model")
print(x,y)                # Mustang Mustang

thisdict["year"] = 2018
print(thisdict)

for x, y in thisdict.items():
  print(x, y)

純量

  • 補充

>>> x = 12.63718

>>> int(x)
12

>>> round(x,2)
12.64

>>> round(x,3)
12.637


sum = 1 + 2 + 3 + 4 + \
      5 + 6

sum = 1 + 2 + 3 + 4 + 5 + 6
將 x=1 , y=2 內的值對調

x = 1
y = 2
temp = x
x = y
y = temp

vs.

x, y = y, x

打開 Linux Command Line

安裝 python

~$ sudo apt-get update
~$ sudo apt-get install python3.6


~$ python -V    查看 python 版本    (大寫V)
~$ python --version
~$ python3

>>> print("Hello world")

>>> print(input("enter your name: "))

>>> exit()

Simple input and output

[ 方法一 ]   直接執行  (Python shell)

~$ vim test.py


name = input("Please enter your name: ")
print("hello, " + name)


i            進入修改模式
Esc + :wq    儲存後並關閉


~$ python3 test.py    執行

~$ vim test.py    再次修改

[ 方法二 ]   寫成腳本再執行 (Python script)

Lab 0 輸出

this_a_string = " SIRLA "
print(this_a_string + " Enlightened ")
print(this_a_string * 3)

請試寫出把輸入的數字乘以2並輸出

print(int(input()) * 2)

或

val = int(input("Please enter a number: "))
print(val * 2)

或

val = input("Please enter a number: ")
print(int(val) * 2)

請試寫出把輸入的數字乘以2並輸出

seconds = int(input("輸入秒數: "))
minutes = seconds // 60
remainingSec = seconds % 60

print(seconds,"秒為",minutes,"分鐘又",remainingSec,"秒")
或
print(str(seconds)+"秒為"+str(minutes)+"分鐘又"+ \
 str(remainingSec)+"秒")

試著寫出 以秒表示總時間長,取得分鐘數及剩餘的秒數。如:500秒為8分鐘又20秒

seconds = int(input("輸入秒數: "))
minutes = seconds // 60
remainingSec = seconds % 60

print(seconds,"秒為",minutes,"分鐘又",remainingSec,"秒")
或
print(str(seconds)+"秒為"+str(minutes)+"分鐘又"+ \
 str(remainingSec)+"秒")

試著寫出 以秒表示總時間長,取得分鐘數及剩餘的秒數。如:500秒為8分鐘又20秒

Lab 1 計算圓面積

radius = eval(input("Enter a value for radius: "))
area = radius**2 * 3.14

print(area)

試著寫出       input 半徑    output 圓面積

圓周率: 3.14

Lab 1 計算圓面積

radius = eval(input("Enter a value for radius: "))
area = radius**2 * 3.14

print(area)

試著寫出       input 半徑    output 圓面積

圓周率: 3.14

eval   V/S   int

兩者皆能將字串轉換為整數

  • int : 無法運作於非整數的字串
    • int("3.4") 產生錯誤
    • int("003") 將會回傳 3
  • eval : 可處理較複雜的轉換
    • eval("3+4") 將會回傳 7
    • eval("003") 產生錯誤

懂得用模組,人生就是彩色的..

sudo apt-get install python-pip

import [module_name] as [Custom_name]

import math
print(math.pi)

import math as m     # 為 math 模組取別名為 m
print(m.pi)


from [module_name] import [name1, name2, ... nameN]

from math import pi
print(pi)

http://dokelung-blog.logdown.com/posts/243281-notes-django-python-modules-and-kits

https://docs.python.org/3/library/math.html

Lab 2 計算圓面積

from math import pi

radius = eval(input("Enter a value for radius: "))
area = radius**2 * pi

print(area)

試著 把

圓周率 = 3.14用 python的函示庫取代

Lab 2 計算圓面積

from math import pi

radius = eval(input("Enter a value for radius: "))
area = radius**2 * pi

print(area)

試著 把

圓周率 = 3.14用 python的函示庫取代

Lab1  打怪

  • input 怪物閃避值
  • output 命中率
  • 初始命中值 = 800
  • 命中率 = (角色命中值 - 怪物閃避值)/1000 * 100%
hit_value = 800
dodge_value = int(input("Input monster's dodging value: "))

# Input your code here
hit_rate = (hit_value - dodge_value) / 1000 * 100
print("Your hit rate is: " + str(hit_rate) + "%")

Lab 1 打怪

  • input 怪物閃避值
  • output 命中率
  • 初始命中值 = 800
  • 命中率 = (角色命中值 - 怪物閃避值)/1000 * 100%
hit_value = 800
dodge_value = int(input("Input monster's dodging value: "))

# Input your code here
hit_rate = (hit_value - dodge_value) / 1000 * 100
print("Your hit rate is: " + str(hit_rate) + "%")

Lab 1+ 打怪前的預備動作

Tips: random + if / else

import random
random.randint(0, 2)    # 在 0, 1, 2 中取亂數

random.randint(1, 2)    # 在 1, 2 中取亂數
num = int(input("enter your number: "))

if num > 0:
    print("Positive")
elif num == 0:
    print("equal 0")
else: # num < 0
    print("Negative")

~ 思考一下 ~

import random

girlfriend_probability = random.randint(0, 100)

if girlfriend_probability == -1:
    print("You wil have a girlfriend soon.")
else:
    print("You're on your own.")
    

while  Loops    v.s.    for  Loops

  • while : 不知道要跑幾次
  • for : 知道要跑幾次
i = 1
while i < 6:
  print(i)
  if i == 3:
    break
  i += 1 

# 印出 1 2 3
i = 0
while i < 6:
  i += 1
  if i == 3:
    continue
  print(i)

# 印出 1 2 4 5 6

break -> 程式中止,不跑了
continue -> 跳過該段程式,繼續下一個

生成一個有10隻怪物的關卡,每隻怪物都有自己的閃避值
input: 每隻怪物閃避值
output: 印出10隻怪物的閃避值

dodge_list = []
for i in range(10):
    dodge_value = int(input("請輸入怪物的閃避值: "))
    dodge_list.append(dodge_value)

for dodge_value in dodge_list:
    print(dodge_value)

或


dodge_list = [100, 200, 300, 400, 500, 600, 700, 800, 900, 1000]

for i in range(10):
    print(dodge_list[i])
#list:  append()、remove()、pop()

生成一個有10隻怪物的關卡,每隻怪物都有自己的閃避值
input: 每隻怪物閃避值
output: 印出10隻怪物的閃避值

dodge_list = []
for i in range(10):
    dodge_value = int(input("請輸入怪物的閃避值: "))
    dodge_list.append(dodge_value)

for dodge_value in dodge_list:
    print(dodge_value)

或


dodge_list = [100, 200, 300, 400, 500, 600, 700, 800, 900, 1000]

for i in range(10):
    print(dodge_list[i])
#list:  append()、remove()、pop()

ITSA 練習題

while True:
    x = str(input())
    x_reverse = x[::-1]
    if x_reverse == x:
        print("YES")
    else:
        print("NO")

Solution

while True:
    n = eval(input())
    pi_even = 0
    pi_odd = 0
    
    if n > 0:
        for k in range(3,2*n+1,4):
            pi_even = pi_even - (4/k)
            for p in range(5,2*n+1,4):
                pi_odd = pi_odd + (4/p)
        print(4 + pi_even + pi_odd)
    else:
        print("")

Solution

補充教材

  • Python 3.7.0 官方文件:https://docs.python.org/3/
  • w3schools 線上教學:https://www.w3schools.com/python/default.asp
  • 一小時Python入門:https://kopu.chat/2017/01/18/%e4%b8%80%e5%b0%8f%e6%99%82python%e5%85%a5%e9%96%80-part-1/

謝謝大家

Python for Beginner

By BessyHuang

Python for Beginner

  • 413