Python
20210122_Python 와 Ruby 비교02 - Ruby 함수, 블럭, 모듈
생활 코딩 "Python & Ruby 강의" 수강후 정리
1. Python vs Ruby
1) 함수(Function)
- 여러곳에서 활용가능하게 하고 코드의 중복을 낮추어 재활용성을 높이며 가독성을 높이는 중요한 기능!
- 복잡해진 프로그램을 함수를 통해 그룹화로 정리해도 좋음
- 함수 만들기
- 로그인 애플리케이션 함수
- 내가 만든 login 함수는 함수안에 넣는 것을 true, false로 반환해준다.
- 그리고 real_login 함수는 로그인을 실행시키며 입력을 받게하여 true, false에 따라 출력문을 제시한다.
def login(id)
members = ['tom', 'jerry', 'snoopy']
for member in members do
if member == id
return true
end
end
return false
end
def real_login()
puts("Enter your id!")
input_id = gets.chomp
if login(input_id)
puts("Hello!, " +input_id)
else
puts("Check your id!")
end
end
puts(real_login())
루비에서만 나타나는 함수 특성
함수 정의시 괄호 생략 가능하고 호출시 괄호 생략도 가능
def f1
return "f1"
end
puts(f1) # 결과 f1
- 매개변수를 받는 경우의 괄호 생략 가능(받는 값은 한칸 띄워서)
def f2 k
return k
end
puts(f2 "hello world!")
# 결과 hello world!
puts f2 "No parenthesis!"
# 결과 No parenthesis!
# puts도 함수니까 괄호 생략 가능함 근데 괄호 없으면 햇갈림
- 함수 정의시 return의 생략
def f3 k
a = 1
b = 1
a + b + k
end
puts f3 2
# 1 + 1 + 2 -> 4 출력
# 함수 마지막에 return을 생략해도 return으로 간주됨
- 주로, 쓰는게 가독성이 좋으므로 쓰고 나중에 다른 사람 코드리딩시 생략가능함을 참고하자
2) 블럭(Block)
- times 함수
a.times() {|i| 코드블럭}
: 코드블럭을 a 번 반복해라 i는 출력시 0 부터 시작하여 1씩 증가- times 함수를 통해서 반복문 보다 효율적이고 직관적임 물론, times 함수 안에 그 해당하는 반복문이 들어 있겠지만
5.times() {puts "5times"}
# 결과
# 5times
# 5times
# 5times
# 5times
# 5times
5.times() {|i| puts i}
# 0
# 1
# 2
# 3
# 4
# 아래 반복문도 같은 결과
k = 0
while k < 5 # do생략 가능함
puts k
k += 1
end
- upto 함수
a.upto(b) {|i| 코드블럭}
: 코드블럭을 a에서 1씩 증가시켜 b가 될때까지 반복해라 i는 코드블럭 안에서 a부터 1씩 증가시킴
3.upto(5) {|i| puts i}
# 3
# 4
# 5
f1 = 0
a = 3
a.upto(5) {|k| f1+=k}
puts(f1)
# 0+3 -> 3+4 -> 7+5 = 12
배열에서 블록의 사용
each 함수
- 배열 안에 있는 것을 하나하나 꺼내는 함수
arr1 = ['a', 'b', 'c']
arr1.each() {|i| puts i}
# a
# b
# c
# 위아래 같은 내용의 코드
for value in arr1
puts(value)
end
- delete_if 함수
- 배열에서 조건을 넣어 true에 해당하는 값을 없애는 함수
arr2 = [1, 3, 55, 63, 34, 52]
arr2.delete_if() {|item|
item > 50
}
puts arr2 # 파이썬과 다르게 그냥 개행으로 출력됨 중괄호 출력이 아니고
# 1
# 3
# 34
# 위아래 같은 내용의 코드임
arr2.delete_if() do |item|
item > 50
end
puts arr2
# 코드가 길어지면 {} 중괄호 말고 do end 사용을 권장함
3) 모듈(Module)
- 복잡도를 낮추고 체계를 갖추는 것인데 다른것을 인용해서 사용시 의도치 않게 같은 이름으로 정의 된것 끼리 충돌할 수 있고 또한 이름을 다르게 지정하더라도 보기 지저분해짐 그래서 모듈을 통해서 해결!
- 함수가 많아지는 경우도 고려하여 함수를 그룹핑 하여 디렉토리화 하는 것에 모듈을 사용함
- python의 경우에는 파일로 분리되는 특성이 있음 (
improt
사용) 즉, 같은 파일내에서 모듈 설정하고 호출이 불가함 - ruby의 경우 파일로 분리될 수 도 있고 안할 수 도 있음 (
require
사용) 즉, 같은 파일내에서 모듈 설정하고 호출도 가능함
module 만들기 (Ruby)
# Module 폴더에 해당 모듈 이름으로 파일을 만든다. tom.rb , jerry.rb
# tom.rb
module Tom # 첫글자 무조건 대문자
module_function() # 모듈이름.함수 형태로 만들어 주는 함수(루비 내장 함수)
def a()
return "a"
end
end
# jerry.rb
module Jerry
module_function()
def a()
return 'b'
end
end
module 연결하기 (Ruby)
# require '모듈 이름' 근데 에디터 환경에서는 작동이 안됨 터미널에선 가능한데
# require './tom' 하면 된다.(단, 실행파일과 같은 위치일 경우)
# require_relative 'tom' (단, 실행파일과 같은 위치일 경우)
# 나는 module 이라는 새로운 폴더에 파일을 생성했기 때문에
require './module/tom'
require './module/jerry'
# 아니면
require_relative 'module/tom'
require_relative 'module/jerry'
puts(Tom.a())
puts(Jerry.a())
# 결과 a b
중복제거
- 겹치는 함수가 있을경우 모듈로 대체하여 사용함으로써 중복제거
- 모듈로 연결했을 때 코드에 문제가 생겨서 고치는 경우 모듈만 고쳐도 모두 반영이 되기 때문에 유지보수가 좋다.
로그인 함수 모듈화와 호출
- 주의점은 루비이므로 모듈이름을 설정해야 하고, 함수 모듈화 함수(module_function)를 사용
- 모듈화
# login.rb 파일을 Module 폴더에 생성-> 모듈화
module Auth
module_function()
def login(id)
members = ['tom', 'jerry', 'snoopy']
for member in members do
if member == id
return true
end
end
return false
end
def real_login()
puts("Enter your id!\n")
input_id = gets.chomp
if login(input_id)
puts("Hello!, " +input_id)
else
puts("Check your id!")
end
end
end
호출
require
는 경로를 불러오는 역할이기 때문에 경로와 파일 이름으로 불러야 하고특정하게 지정한 모듈이름은 호출시에 사용
# 로그인 모듈 연결 해보기
# 경로 주의하고, 파일 이름으로 연결해야함
require "./module/login"
# 호출시에는 지정했던 모듈 이름으로 호출
puts(Auth.real_login())
내일은 루비 객체지향 들어감, 파이썬 복습 겸
'Python' 카테고리의 다른 글
20210127_Python 와 Ruby 비교04 - 인스턴스 변수 접근, 클래스 변수(클래스 멤버), 오버라이딩 (0) | 2021.01.27 |
---|---|
20210123_Python 와 Ruby 비교03, 객체지향, class, instance (0) | 2021.01.24 |
20210121_Python 와 Ruby 비교 01 - Ruby 위주로 (0) | 2021.01.21 |
20210113_ Python 입문10(총 활용), 간단한 타이핑 게임 (0) | 2021.01.13 |
20210111_ Python 입문9, 데이터베이스 연동(SQLite) (0) | 2021.01.12 |