# 第十一天 Functions函數
> [color=#40f1ef][name=LHB阿好伯, 2020/12/18][:earth_africa:](https://www.facebook.com/LHB0222/)
###### tags: `Python_30` `R & python`
![](https://i.imgur.com/BiRMn8Q.jpg)
[TOC]
🌟
# 自訂函數Defining a Function
函數是指在執行特定任務的可重複性程式碼
為了定義一個函數
R使用 ==function()== 賦值給函數名稱
可以設定print()輸出或return()控制回傳資料
:::danger
```r=
#R 程式碼說明
函數名稱 <- function(參數1, 參數2, ...){
程式碼...
程式碼...
return(回傳的資料)
}
```
:::
```r=
# R code
greetings <- function(name){
message <- paste0(name, ', welcome to R for Everyone!')
return(message)
}
print(greetings('Asabeneh'))
```
:::success
[1] "Asabeneh, welcome to R for Everyone!"
:::
```r=
# R code
#設計一個計算圓面積的函數
area_of_circle <- function(r){
PI = 3.14
area = PI * r ** 2
return(area) #可以不用寫
}
print(area_of_circle(10))
```
:::success
[1] 314
:::
Python使用 ==`def`== 關鍵字建立函數
須設定print()輸出或return回傳資料
不然執行自訂函數是不會有輸出的
:::danger
```python=
def 函數名稱(參數1, 參數2, ...):
程式碼...
程式碼...
return 回傳的資料
```
:::
範例:
```python=
# Python code
def greetings (name):
message = name + ', welcome to Python for Everyone!'
return message
print(greetings('Asabeneh'))
```
```python=+
# Python code
def greetings (name):
message = name + ', welcome to Python for Everyone!'
print(message)
greetings('Asabeneh')
```
:::success
Asabeneh, welcome to Python for Everyone!
:::
```python=
# Python code
#設計一個計算圓面積的函數
def area_of_circle (r):
PI = 3.14
area = PI * r ** 2
return area
print(area_of_circle(10))
```
:::success
314.0
:::
## 使用reture回傳結果的應用
大部分時候會建議大家使用reture回傳結果
因為在函數中使用一些判斷句時會有多個可能的解果
這時候就可以依照不同結果回傳資料
例如下面設計一個公式判斷輸入的數字是否為偶數
```r=
# R code
is_even <- function(n){
if(n %% 2 == 0){ #計算餘數
print('even')
return(TRUE)
} else {
return(FALSE)
}
}
print(is_even(10))
print(is_even(7))
```
:::success
[1] "even"
[1] TRUE
[1] FALS
:::
```python=
# Python code
def is_even (n):
if n % 2 == 0:
print('even')
return True # return會停止執行下一步的程式碼,類似於break
return False
print(is_even(10)) # True
print(is_even(7)) # False
```
:::success
even
True
False
:::
# 添加默認參數
有時在使用函數時如果未傳遞參數,則將使用其默認參數值
可以保留後續函數方便性與使用的彈性
:::danger
```r=
#R 程式碼說明
函數名稱 <- function(參數1 = 預設值, 參數2 = 預設值, ...){
程式碼...
程式碼...
return(回傳的資料)
}
```
```python=
#Python 程式碼說明
def 函數名稱(參數1 = 預設值, 參數2 = 預設值, ...):
程式碼...
程式碼...
return 回傳的資料
```
:::
```r=
# R code
greetings <- function(name = 'Peter'){
message = paste0(name, ', welcome to R for Everyone!')
return(message)
}
print(greetings())
print(greetings('Asabeneh'))
```
:::success
[1] "Peter, welcome to R for Everyone!"
[1] "Asabeneh, welcome to R for Everyone!"
:::
```python=
# Python code
def greetings (name = 'Peter'):
message = name + ', welcome to Python for Everyone!'
return message
print(greetings())
print(greetings('Asabeneh'))
```
:::success
Peter, welcome to Python for Everyone!
Asabeneh, welcome to Python for Everyone
:::
## 任意數量的參數輸入
如果不知道輸入給函數的參數數量
R可以使用三個點 ==...== 作為指定其他數量的參數輸入
:::danger
```r=
#R 程式碼說明
函數名稱 <- function(參數1, ...){
程式碼(...)
程式碼(...)
return(回傳的資料)
}
```
:::
```r=
# R code
generate_groups <- function(team, ...){
print(team)
for( i in list(...)){
print(i)
}
}
generate_groups('Team-1','Asabeneh','Brook','David','Eyob')
```
:::success
[1] "Team-1"
[1] "Asabeneh"
[1] "Brook"
[1] "David"
[1] "Eyob"
:::
Python可以通過在參數名稱前添加一米字號 ==*== 來創建一個可以接收任意數量參數的函數
:::danger
```python=
#Python 程式碼說明
def 函數名稱(*參數1, 參數2 = 預設值, ...):
程式碼...
程式碼...
return 回傳的資料
```
:::
```python=
# Python code
def generate_groups (team,*args):
print(team)
for i in args:
print(i)
generate_groups('Team-1','Asabeneh','Brook','David','Eyob')
```
:::success
Team-1
Asabeneh
Brook
David
Eyob
:::
## 函數作為另一個函數的參數
函數可以算是一個物件
所以可以將整個函數作為其他函數的參數
我們直接看範例
```r=
# R code
square_number <- function(n){
return(n * n)
}
do_something <- function(f, x){
return(f(x))
}
print(do_something(square_number, 3))
```
:::success
[1] 9
:::
```python=
# Python code
def square_number (n):
return n * n
def do_something(f, x):
return f(x)
print(do_something(square_number, 3))
```
:::success
9
:::
# Lambda-無名函數
Lambda函數是一個沒有名稱的小型無名函數
它可以接受任意數量的參數
但只能有一個表達式
可以再一個函數中編寫一個無名函數
## 基本寫法
:::success
```python=
lambda 參數1, 參數2, 參數3, ... : 程式碼
```
:::
```python=
# Python code
add_two_nums = lambda a, b: a + b
print(add_two_nums(2,3))
```
:::success
5
:::
## 嵌套於別的函數中
```python=
# Python code
def power(x):
return lambda n : x ** n
cube = power(2)(3)
print(cube)
```
:::success
8
:::
🌟全文可以至下方連結觀看或是補充
https://hackmd.io/@LHB-0222/30_Days_of_Python-11
全文分享至
https://www.facebook.com/LHB0222/
https://www.instagram.com/ahb0222/
有疑問想討論的都歡迎於下方留言
喜歡的幫我分享給所有的朋友 \o/
有所錯誤歡迎指教
# [:page_with_curl: 全部文章列表](https://hackmd.io/@LHB-0222/AllWritings)
![](https://i.imgur.com/47HlvGH.png)