網頁

2017年1月14日 星期六

函數

內建函數1
Python 的內建函數(generic functions)
使用 help() 查詢文件
使用 type() 函數來觀察變數類型

內建函數2
help(sorted)

out:
Help on built-in function sorted in module builtins: 
sorted(iterable, key=None, reverse=False) 
    Return a new list containing all items from the iterable in ascending order. 
    A custom key function can be supplied to customise the sort order, and the                   reverse flag can be set to request the result in descending order.

distances = [3, 5, 10, 21, 42.125]

# 應用函數
print(max(distances)) # 最長的距離
print(min(distances)) # 最短的距離
print(len(distances)) # 總共有幾個距離
print(sorted(distances, reverse = True)) # 遞減排序


自訂函數1

自訂函數的結構

def function_name(輸入, 參數 1, 參數 2, ...):
    '''
    Docstrings # 說明 
    '''
    # 做些什麼事 
    return 結果

自訂函數2

import math # 要使用 pi 得引入套件 math

# 定義自訂函數 
def circle_calculate(radius, area = True): 
    '依據輸入的半徑與 area 參數計算圓形的面積或周長' # 單行的 docstring 
    circle_area = math.pi * radius**2 
    circle_circum = 2 * math.pi * radius 
    if (area == True): 
        return circle_area 
    else: 
        return circle_circum 

# 呼叫自訂函數 
help(circle_calculate) # 查詢自訂函數 
my_radius = 3 print(circle_calculate(my_radius)) # 預設回傳面積 print(circle_calculate(my_radius, area = False)) # 指定參數回傳周長

自訂函數3
在 return 後面將多個值用逗號 , 隔開就會回傳一個 tuple

import math # 要使用 pi 得引入套件 math  

# 定義自訂函數 
def circle_calculate(radius): 
    '依據輸入的半徑同時計算並回傳圓形的面積或周長' # 單行的 docstring 
    circle_area = math.pi * radius**2 
    circle_circum = 2 * math.pi * radius 
    return circle_area, circle_circum 

# 呼叫自訂函數 
my_radius = 3 
print(circle_calculate(my_radius))

自訂函數4
交換排序法(exchange sorting)
import random # 呼叫函數時使用隨機整數

# 定義自訂函數
def exchange_sort(input_list, reverse = False):
    ''' # 多行的 docstrings
    依據輸入的 list 與 reverse 參數排序 list 中的數字後回傳。
    reverse 參數預設為 False 遞增排序,可以修改為 True 遞減排序。
    '''
    input_list_cloned = input_list
    # 遞增排序
    if reverse == False:
        for i in range(0, len(input_list) - 1):
            for j in range(i+1, len(input_list)):
                # 如果前一個數字比後一個數字大則交換位置
                if input_list_cloned[i] > input_list_cloned[j]:
                    temp = input_list_cloned[i]
                    input_list_cloned[i] = input_list_cloned[j]
                    input_list_cloned[j] = temp
    # 遞減排序
    else:
        for i in range(0, len(input_list) - 1):
            for j in range(i+1, len(input_list)):
                # 如果前一個數字比後一個數字小則交換位置
                if input_list_cloned[i] < input_list_cloned[j]:
                    temp = input_list_cloned[i]
                    input_list_cloned[i] = input_list_cloned[j]
                    input_list_cloned[j] = temp
    return input_list_cloned

#呼叫自訂函數
my_list = random.sample(range(0, 100), 10) #產生一組隨機數
print(my_list) #看看為排序前
print(exchange_sort(my_list)) #預設遞增排序
print(exchange_sort(my_list, reverse = True)) #指定參數遞減排序


巢狀函數

在函數裡面嵌入函數
舉例來說一個計算平均數的函數裡面應該要包含兩個函數:
一個是計算總和的函數 my_sum()
一個是計算個數的函數 my_length()

# 定義自訂函數 
def my_mean(input_list): 
  '計算平均數' # docstrings 
  def my_sum(input_list): 
    '計算總和' 
    temp_sum = 0 
    for i in input_list: 
      temp_sum += i 
    return temp_sum 
  def my_length(input_list): 
    '計算個數' 
    temp_length = 0 
    for i in input_list: 
      temp_length += 1 
    return temp_length 
  return my_sum(input_list) / my_length(input_list) 

# 呼叫自訂函數 
one_to_10 = range(1, 11) 
print(my_mean(one_to_10))


錯誤處理
Python 使用 try - except 的語法結構進行錯誤處理
import math # 要使用 pi 得引入套件 math  

# 定義自訂函數 
def circle_calculate(radius): 
  '依據輸入的半徑同時計算並回傳圓形的面積或周長' # 單行的 docstring 
  try: 
    circle_area = math.pi * radius**2 
    circle_circum = 2 * math.pi * radius 
    return circle_area, circle_circum 
  except: 
    print("請輸入數值。") 

# 呼叫自訂函數 
my_radius = "3" 
circle_calculate(my_radius)

作業二(temporary)

import math
def my_sd_function(numbers):
  '自定的標準差函數,請輸入一個數列'
  N = len(numbers)
  sumation = 0
  for i in numbers:
    sumation += number
  mu = sumation / N
  for j in numbers:
    another_sumation += (J-mu)**2
  return math.sqrt(another_sumation / N)

my_list = range(1, 6) 
print(my_sd_function(my_list))



















沒有留言:

張貼留言