Julia Language
조건부
수색…
통사론
- if cond; 신체; 종료
- if cond; 신체; 그밖에; 신체; 종료
- if cond; 신체; elseif cond; 신체; 그밖에; 종료
- if cond; 신체; elseif cond; 신체; 종료
- 조건? iftrue : iffalse
- cond && iftrue
- cond || iffalse
- ifelse (cond, iftrue, iffalse)
비고
모든 조건 연산자와 함수는 부울 조건 ( true
또는 false
)을 사용합니다. Julia에서 부울 유형은 Bool
입니다. 다른 언어와 달리 다른 종류의 숫자 ( 1
이나 0
과 같은), 문자열, 배열 등 은 조건문에서 직접 사용할 수 없습니다 .
일반적으로 조건부 연산자 또는 함수의 조건에서 조건부 함수 ( Bool
을 반환하는 함수) 또는 비교 연산자 를 사용합니다.
if ... else 표현식
Julia에서 가장 일반적인 조건문은 if
... else
표현식입니다. 예를 들어 아래에서 우리는 기본 공약 을 처리하기위한 조건부를 사용하여 최대 공약수 를 계산 하기 위한 유클리드 알고리즘 을 구현합니다.
mygcd(a, b) = if a == 0
abs(b)
else
mygcd(b % a, a)
end
Julia의 if
... else
형식은 실제로 표현식이며 값을가집니다. 값은 취해진 분기에서 꼬리 위치 (즉, 마지막 표현식)의 표현식입니다. 다음 샘플 입력을 고려하십시오.
julia> mygcd(0, -10)
10
여기서 a
는 0
이고 b
는 -10
입니다. 조건 a == 0
이 true
이므로 첫 번째 분기가 수행됩니다. 반환 값은 abs(b)
이며 10
입니다.
julia> mygcd(2, 3)
1
여기서 a
는 2
이고 b
는 3
입니다. 조건 a == 0
은 거짓이므로 두 번째 분기를 mygcd(3 % 2, 2)
mygcd(b % a, a)
계산합니다. %
연산자는 3
을 2
로 나눈 나머지 (이 경우 1
반환합니다. 따라서 우리는 mygcd(1, 2)
계산하고,이 때 a
는 1
이고 b
는 2
입니다. 다시 한번, a == 0
은 거짓이므로 두 번째 분기를 mygcd(b % a, a)
계산합니다. 이것은 mygcd(0, 1)
입니다. 이번에는 a == 0
이어서 abs(b)
가 반환되어 결과가 1
됩니다.
if ... else 문
name = readline()
if startswith(name, "A")
println("Your name begins with A.")
else
println("Your name does not begin with A.")
end
if
... else
표현식과 같은 모든 표현식을 명령문 위치에 넣을 수 있습니다. 이것은 값을 무시하지만 여전히 부작용에 대한 표현식을 실행합니다.
if 문
다른 식과 마찬가지로 if
... else
식의 반환 값은 무시할 수 있으므로 무시할 수 있습니다. 일반적으로 식의 본문에 파일에 쓰거나 변수를 변경하거나 화면에 인쇄하는 등 부작용이있는 경우에만 유용합니다.
또한 if
... else
표현식의 else
분기는 선택 사항입니다. 예를 들어, 특정 조건이 충족되는 경우에만 다음 코드를 화면에 출력 할 수 있습니다.
second = Dates.second(now())
if iseven(second)
println("The current second, $second, is even.")
end
위의 예제에서, 우리는 현재 시간 을 얻기 위해 시간과 날짜 함수를 사용 합니다 ; 예를 들어, 현재 10:55:27이면 변수 second
는 27
을 유지합니다. 이 숫자가 짝수이면 화면에 선이 인쇄됩니다. 그렇지 않으면 아무것도 수행되지 않습니다.
삼항 조건부 연산자
pushunique!(A, x) = x in A ? A : push!(A, x)
삼항 조건 연산자는 덜 말의 인 if
... else
식입니다.
구문은 구체적으로 다음과 같습니다.
[condition] ? [execute if true] : [execute if false]
이 예에서는 추가 x
컬렉션에 경우에만 A
x
에없는 . A
그렇지 않으면 A
변경하지 않고 그대로 둡니다.
삼항 연산자 참조 :
단락 연산자 : && 및 ||
분기 용
단락 조건 연산자 &&
와 ||
다음 구조체의 경량 대체품으로 사용할 수 있습니다.
-
x && y
는x ? y : x
와 같습니다x ? y : x
-
x || y
는x ? x : y
와 동일x ? x : y
단락 회로 운영자의 한 가지 용도는 조건을 테스트하고 그 조건에 따라 특정 조치를 수행하는보다 간결한 방법입니다. 예를 들어, 다음 코드는 인수 x
가 음수이면 오류를 던지기 위해 &&
연산자를 사용합니다.
function mysqrt(x)
x < 0 && throw(DomainError("x is negative"))
x ^ 0.5
end
||
조건이 유지되지 않는 한 그 오류를 유발하는 것을 제외하고 운전자는, 오류 검사에 사용할 수있는 상태가 아닌 경우의 보유 :
function halve(x::Integer)
iseven(x) || throw(DomainError("cannot halve an odd number"))
x ÷ 2
end
이것의 또 다른 유용한 응용 프로그램은 이전에 정의되지 않은 경우에만 개체에 기본값을 제공하는 것입니다.
isdefined(:x) || (x = NEW_VALUE)
여기에서 기호 x가 정의되어 있는지 확인합니다 (즉, 객체 x
값이 할당 된 경우). 그렇다면 아무 일도 일어나지 않습니다. 그러나 그렇지 않으면 x
가 NEW_VALUE
로 지정됩니다. 이 예제는 최상위 범위에서만 작동합니다.
조건 있음
연산자는 두 조건을 테스트하는 데 사용할 수 있기 때문에 유용합니다. 두 번째 조건은 첫 번째 조건의 결과에만 따라 평가됩니다. 줄리아 문서에서 :
표현식
a && b
에서b
가true
평가되면 부분 표현식b
만 평가됩니다a
표현식
a || b
가있는 경우a
b
가false
평가되면 부분 표현식b
만 평가됩니다a
모두 동안 따라서, a & b
와 a && b
얻을 것 true
둘 경우 와 a
b
있는 true
, 경우 그들의 행동 a
이다 false
다르다.
예를 들어, 객체가 양수인지 여부를 확인하고자 할 때, 숫자가 아닐 수도 있습니다. 시도한 두 구현 간의 차이점을 고려하십시오.
CheckPositive1(x) = (typeof(x)<:Number) & (x > 0) ? true : false
CheckPositive2(x) = (typeof(x)<:Number) && (x > 0) ? true : false
CheckPositive1("a")
CheckPositive2("a")
CheckPositive1()
은 숫자가 아닌 유형이 인수로 제공되면 오류를 생성합니다. 첫 번째 결과에 상관없이 두 표현식을 모두 평가하고 두 번째 표현식이 숫자가 아닌 유형으로 평가하려고하면 오류가 발생하기 때문입니다.
그러나 두 번째 표현식은 첫 번째 표현식이 true
경우에만 평가되므로 CheckPositive2()
는 숫자가 아닌 유형이 제공된 경우 오류가 아닌 false
반환 true
.
둘 이상의 단락 회로 운영자가 함께 연결될 수 있습니다. 예 :
1 > 0 && 2 > 0 && 3 > 5
여러 분기가있는 if 문
d = Dates.dayofweek(now())
if d == 7
println("It is Sunday!")
elseif d == 6
println("It is Saturday!")
elseif d == 5
println("Almost the weekend!")
else
println("Not the weekend yet...")
end
가능하다면 마지막 else
분기가 있거나없는 if
문과 함께 elseif
분기가 여러 개 사용될 수 있습니다. 후속 조건은 모든 이전 조건이 false
으로 판명 된 경우에만 평가됩니다.
ifelse 함수
shift(x) = ifelse(x > 10, x + 1, x - 1)
용법:
julia> shift(10)
9
julia> shift(11)
12
julia> shift(-1)
-2
ifelse
함수는 선택되지 않은 분기조차도 두 가지 분기를 평가합니다. 이것은 분기가 평가되어야하는 부작용이 있거나, 두 분기가 모두 저렴하면 더 빠를 수 있기 때문에 유용 할 수 있습니다.