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가있는 경우ab가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 함수는 선택되지 않은 분기조차도 두 가지 분기를 평가합니다. 이것은 분기가 평가되어야하는 부작용이 있거나, 두 분기가 모두 저렴하면 더 빠를 수 있기 때문에 유용 할 수 있습니다.