Tip:
Highlight text to annotate it
X
이 강의의 한국어자막은 www.snow.or.kr 자원활동가들에 의해 작성되었습니다. 다음 내용은 저작권으로
보호되어 있습니다.
MIT OCW(무료공개강좌) 는 계속해서 고품질의 교육자원을
무료로 제공함으로써 여러분을 도와줄 것입니다.
추가적인 MIT 코스의 자료를 보거나
기부하시려면 ocw.mit.edu을
방문해주세요.
좋아요.
경고의 말입니다: 안전 벨트를 매세요.
또는 다른 말로, 저는 오늘 소방 호스를
약간 들이대려고 합니다.
지난 시간에, 여러분은 이 수업이 SHASS 수업이라고 생각했을 겁니다.
이것은 철학 수업과는 다릅니다. 그리고 우리가 무엇을 말할 것인지에 대한
기초를 닦는 것이 중요 했습니다. 그러나
우리는 매우 높은 수준의 것을 이야기 했습니다.
레시피의 개념, computation의 개념, 왜 여러분이 이것을 해야 하는지,
우리가 배우려고 하는 것은 무엇인지를요.
오늘 우리는 핵심인 computation 기초의 기본 사항으로 들어가려고 합니다.
그리고 특히,
오늘 하려고 하는 것은
연산자와 피연산자입니다. 우리는 지난 시간에 조금 했습니다.
특히 어떻게 명령문을 만드는지를요. 저는 코드를 쓰기 위한 블록을 짓는 키로써
statement에 대해 이야기 하려고 합니다.
그리고 프로그램의 간단한 세트를 소개할 것입니다.
특히 branching,
조건문, 선언문에 대해 이야기 하려고 합니다.
그래서, 할 것이 많습니다.
알겠죠?
이것을 바로 시작해 봅시다.
지난 시간 마지막에, 우리는 여러분이 원하는 것의 일부를
소개하기 시작했습니다.
그리고 저는 우리의 목표를 상기시키고 싶군요.
우리는 프로세스들을 설명하고 합니다.
우리는 새로운 정보를 추론할 것을
가지고 싶습니다.
그래서 우리는 그것을 할 프로그램을 쓸 것입니다.
우리가 프로그램을 쓴다면, 우리는 적어도
두 가지가 필요합니다: 기본적인 데이터의
표현입니다.
그리고 우리는 그것의 두 가지 예를 지난 시간에 보았습니다.
그리고 우리가 필요한 두 번째 것은 데이터를 조작하기 위해
컴퓨터에게 명령을 내리는
방법입니다.
우리는 그것에 레시피의 설명을 주어야 합니다.
초기 데이터의 관점에서, 우리가 본 것은
두 가지였습니다: 그렇죠?
숫자와 문자열입니다.
이 강의에서 조금 나중에 우리는
세 번째 것을 소개할 것입니다. 그러나 용어를 통해
우리가 보려고 하는 것은, 우리가 만들어 낸 데이터 구조가 얼마나 복잡하더라도,
그리고 우리는 다양한 데이터 구조들을 만들 것입니다,
근본적으로 그들 모두는 그들의 기본,
그들의 원자적 단계를 가지고 있습니다. 그것은 숫자의 조합,
문자열의 조합이 될 것입니다.
그것은 boolean인데,
이 강의 조금 나중에 소개할 것입니다.
그리고 이것이 말이 됩니까?
숫자들은 숫자적인 일을 하고, 문자열들은
문자 정보를 표현하는 기본적인 방법입니다.
그리고 우리는 우리가 해 나가면서 그것들을
어떻게 조합하는지를 보려고 합니다.
우리가 본 두 번째 것은, 모든 초기 값과
관련 있는 타입입니다.
그리고 이것들은 명백합니다, 그렇죠?
문자열은 문자열입니다.
숫자는, 다양한 것이 있습니다.
Integer도 있고, float도 있습니다.
우리는 나중에 몇 가지를 더 소개할 것입니다.
그러나 이런 타입들은 중요합니다. 왜냐하면 그것들이 우리에게
우리가 그들을 합칠 때 원하는 것에 대해 알려 주기 때문입니다.
좋아요, 그렇지만, 저는 값과, 예, 타입을
두 가지를 가진다는 것을 강조하고 싶군요.
우리가 한 번 그것을 가지면, 우리는 그것의
조합을 만들기 시작합니다.
우리는 그것들을 합치고 싶습니다.
그리고 그것을 위해, 우리는 명령문에서 그것들을 합칩니다.
그리고 명령문에서 우리가 보는 것은 연산자와
피연산자의 형태입니다.
그리고 우리가 한 가장 간단한 것은 여러분이 숫자적인 것으로부터
예상한 것이었습니다.
이제 저는 여기서 한 가지 다른 뉘앙스를 강조하려고 합니다.
그것은, 그리고 우리는 이것의 예제들을 해 볼 텐데,
처음에 우리는 표현식을 인터프리터로 타이프했습니다;
즉, 직접 파이썬으로요.
그리고 제가 지난 시간에 주장한대로, 인터프리터는 사실
기계 내부의 프로그램입니다. 그것은 기본적으로 값을 추론하고
그것을 프린트하기 위해 여기서 설명하는 법칙들을
따르고 있습니다.
그리고 우리가 직접 인터프리터로 타이프하면, 그것은 필수적으로
평가하고 프린트 합니다.
그것이 평가하고, 그리고 프린트 합니다.
대부분, 우리는
코드 내부의, 스크립트 내부의,
파이썬 언어인 명령문들을 할 것입니다.
거기서, 저는 이 차이, 이 뉘앙스를 만들고 싶습니다:
평가자는 여전히 이 식을 사용할 것이고 값을 얻기 위해
그것의 규칙들을 사용할 것이지만, 그것은
프린트 하지는 않습니다.
왜 그럴까요?
왜냐하면 전형적으로, 여러분은 프로그램 어디에서 그것을
사용하기 때문입니다.
그것은 변수 안에 저장됩니다.
그것은 데이터 구조 안에 저장됩니다.
그것은 부작용을 위해 사용됩니다.
그래서, 코드 안에, 또는 스트립트 안에, 프린트가 없습니다.
여러분이 그것을 분명히 하지 않으면요.
그리고 약간 주저 합니다, 그것은 자세합니다,
그러나 저는 하나를 강조하고 싶습니다.
여러분이 여러분 코드 안에서 무엇이 프린트하게 하고 싶으면,
여러분은 기계에 그렇게 하라고 말해주어야 합니다.
좋아요.
그래서 몇 가지 간단한 예제들을 해 봅시다.
우리는 이미 다른 사람의 것을 보았습니다.
저는 여러분에게 상기 시키고 싶군요. 예를 들어, 이와 같은 명령문을 타이프하고 싶다면,
문법적인 형태에 주목하세요.
이것은 명령문, 숫자입니다. 이어서 연산자,
다른 명령문이 있습니다.
그리고 물론 저는 거기서 좋아하는 값을 얻습니다.
네.
오, 여러분은 왼쪽으로 그렇게 멀리 기울고 싶지 않습니까?
좋아요, 여러분은 공화주의자이니까, 저는 이것을 기쁘게
약간 옮기겠습니다.
와우, 존, 제가 정치적인 유머로 웃겼어요,
저는 큰 문제에 빠졌습니다.
이것이 낫습니까?
젠장, 좋아요, 저는 이것을 더욱 자주 해야겠군요.
좋아요, 해 봅시다, 보세요, 저는 여기 이것을 하고 싶습니다,
저는 이것을 볼 수 없어요. 아, 저는 안도의 한숨을 들었어요,
네, 좋습니다.
해 봅시다.
더 낫군요.
좋아요.
우리가 지난 시간에 보여 준 다른 것 중 하나는
연산자들이 오버로드 된다는 것이었습니다.
그리고 이것은 존과 제가 동의하지 않는 부분이었습니다.
저는 이와 같은 것을 하지만, 그는 이것이 괜찮은 것이라고 생각합니다.
특히 – 후아, 우리는 이런 것을 하지 않습니다, 우리는 이것을 합니다 –
즉, 문자 열에서 숫자 곱셈의 조합을 주세요,
이것은 사실 우리에게 많은 함께 이어진 문자열의
복제한 것들과 함께 새로운 문자열을
줄 것입니다.
여러분이 다른 것을 하고 싶다면, 예를 들어,
우리는 두 개의 문자열을 가지고 더할 수 있습니다 – 웁스, 미안해요 – 그리고 그것들을 함께
더하세요, 우리는 다시, 문자열의 연속을
얻을 것입니다.
그리고, 우리는 여러분이 다양하게 해 보도록 할 것이지만,
이것들은 우리가 사용할 수 있는 간단한 명령문들입니다.
이제, 가끔씩 조금 흥미로워 집니다.
알겠죠?
그 명령문의 값은 무엇입니까?
여러분은 제가 그 명령문을 평가한다면 무슨 일이 일어날 것이라고 생각합니까?
무슨 일이 일어날까요?
에러요?
훌륭해요.
그것이 말하는 것을, 확인해 봅시다.
확실히 그렇군요.
우리는 뇌물을 받은 사람들 입니다.
아, 그런데, 존은 양키스의 팬입니다.
그는 Damon 처럼 던져요. 저는 레드 삭스 팬이구요,
그래서 우리는 볼 것입니다, 이것은 어떻습니까?
그리고 저는 대부분 존의 공을 쳤습니다, 좋아요.
제 세 번째는 맞아요, 정확하군요, 제가 무엇을 말할 수 있습니까?
좋아요, 우리는 여러분이 여기서 어울리면서 여러분에게 뇌물을 주는 것으로 들어가고 있습니다,
됐죠?
여러분은 학기 말에 나쁘게 비만이 될 것입니다.
네, 이것은 문법 에러입니다, 왜냐하면
이것은 이걸 어떻게 다뤄야 하는지를 모르거든요.
그러나 여기에 중요한 것이 있습니다. 사실
제가 이것들을 문자열로 조합하고 싶으면, 저는 기계한테 그렇게 하라고 말했어야 합니다,
그리고 저는 그렇게 할 수 있습니다, 명확하게 말을 해야죠,
그것을 가져와서, 숫자를요, 그리고 그것을 문자열로 변환합니다,
그리고 나서 – 아, 저는 그것을 계속 하고 있습니다 – 그리고 그것을
그 문자열에 더하세요.
좋아요, 여기 중요한 핵심이 있습니다.
우리는 형 변환이라는 것을 했습니다.
즉, 제가 특정한 방법으로 두 개를 조합하고 싶으면,
저는 제가 그것을 연산자에게 줄 것인지
확실히 해야 합니다.
그래서 STR, 제가 거기 타이프한 것은, 괄호 안에서 가져와서,
집어 넣고, 그리고 그것을 문자열로 변환합니다,
그래서 저는 제가 문자열로 기대 했던 곳에 그것을 사용할 수 있습니다.
존.
문법에 정적 의미 에러가 있군요.
고마워요.
저는 곧 그것을 하려고 했지만, 고마워요,
존, 그것을 지적해 줘서요.
좋아요.
왜 이것이 정적 의미 에러 일까요?
문법은 맞습니다, 피연산자,
연산자, 피연산자의 관점에서요, 그래서 문법적으로 맞습니다.
의미는 문제를 일으키는 것인데,
연산자가 거기서 특정한 구조를 기대하고 있었기 때문입니다.
연산자가 거기서 특정한 구조를 기대하고 있었기 때문입니다.
여기 제가 강조하고 싶은 두 번째 것이 있습니다.
왜냐하면 이것은 정말로 중요하기 때문입니다.
네 정말로요.
좋아요, 해 봅시다.
제가 강조하고 싶은 두 번째 것은, 어떤 것이냐 하면,
파이썬이 어떤 타입 검사를 한다는 것입니다.
그것은 에러를 잡습니다. 왜냐하면 그것이 무엇을 적용하기 전에
피연산자의 타입을 검사하고,
나는 멈출거야 라고 말하기 때문입니다.
이제, 여러분은 말할 수도 있습니다,
왜 제가 사실 그것들을 문자열로 다루고
그것들을 조합하길 원한다고 가정하지 않았습니까?
합리적으로 들리는군요.
그러나 이것은 위험한 것입니다.
왜냐하면 그렇게 할 때, 파이썬은 computation의
다른 부분으로 넘겨주는 값을 가집니다,
그리고 그것이 제가 원하던 것이 아니면,
저는 사실 말이 되지 않는 결과를 얻기 전에 computation에서
다운스트림 방법을 쓸 수도 있습니다.
그리고 그것이 어디로부터 왔는지 추적하는 것은 정말 힘들 수 있습니다.
그래서 저는 제가 할 수 있는 한 일찍
타입 검사를 합니다.
그리고 사실, 타입 검사에서, 다른 언어들은
때때로 약한 것부터 강한 스펙트럼에 떨어집니다.
기본적으로, 타입 검사는 얼만큼 합니까?
이제, 여러분은 존과 제가 앞 뒤로 많이 왔다 갔다 하는 것을 듣게 될 것입니다,
제가 오래 전에 말한 대로 – 확실히 오래 전 이었지만,
저는 또한 오랜 Lisp 프로그래머입니다.
저는 Lisp를 좋아하지만, Lisp는 확실히
매우 약한 타입의 언어 범위에 듭니다.
그것은 그것의 타입을 전혀 검사하지 않습니다.
파이썬은, 확실히 강하지만,
스펙트럼의 강한 끝 부분에 더욱 가깝습니다.
그것은 사실 넘겨 주기 전에
타입 검사를 많이 할 것입니다.
그렇지만, 저는 그것이 아마 우리가 좋아하는 것처럼
강한 타입은 아니라고 주장하고 싶군요.
예를 들어, 명령문이 있습니다.
이제, 여러분이 전에 이것을 사용한 적이 없으면,
이것은 단지 여러분이 예산한 연산자입니다, 이것은 두 가지를 비교하고
첫 번째 인수가 두 번째 인수 보다 작은지에 따라
true 나 false를 리턴해 줄 것입니다.
여기서 무슨 일이 일어납니까?
다시 말해, 저는 도움이 필요해요, 어디에 사탕을 던질지 알 수 있도록요.
저는 또한 돋보기를 끼고 있습니다, 저는
아무 것도 볼 수 없어요.
아무도요.
조교들은 중요하지 않습니다, 그들은 그들의 사탕을 가지고 있어요.
네.
좋은 질문입니다.
합리적인 추측 같아요, 그렇죠?
세계에서 저는 어떻게 문자열을 숫자와 비교합니까?
제 목표가 얼마나 좋은지 보세요, 아, 나쁘지 않군요.
좋아요.
좋은 요청입니다 – 미안해요, 좋은 생각입니다, 그런데 사실,
골칫덩이군요.
또는 제 아들은 이상한 손가락 이라고 할거에요.
알겠습니까?
여기서 무슨 일이 일어 나고 있습니까?
여기는 – 저는 당신에 대해 모르겠어요, 존,
저는 이것이 사실 좋지 않다고 생각해요, 왜냐하면 이것이 하고 있는 것은, --
미안해요, 다시 돌아가서 말할 게요 – 이것은 오버로드 되었어요.
그것은 기본적으로
사전 순으로 또는
기계 내의 숫자를 포함하는
기호 순서로 비교할 수 있어요.
그리고, 제 생각에, 이것은 에러가 있을 거 같아요.
왜 여러분은 비교를 하려고 합니까?
그것의 예를 주겠어요, 예를 들어, 저는 다음을 할 수 있습니다:
좋아요, 숫자 4는 문자 3 보다 작습니다,
반면에 문자 4는, 웁스,
문자 3 보다 작지 않습니다.
그리고 이것은 이상한 방법으로 문자열과
숫자를 비교하는 것입니다.
그래서 제가 이것을 왜 보여 주고 있나요?
부분적으로는 이것이 이상하다는 것을 보여주기 위해서지만,
또한 여러분에게 타입 지시라는 것을
말해 주기 위해서입니다.
무슨 말인가 하면, 여러분은 코드를 쓸 때, 연산자와 프로시저를 검사하는 습관에 빠집니다,
다른 상황 하에서 그것들이 무엇을 하는지 보기 위해서요.
그것들을 검사하거나 그것의 설명을 읽습니다.
그리고 두 번째로, 여러분이 코드를 쓸 때,
여러분은 여러분이 연산자에 적용하는 인수나
피연산자의 타입이 무엇인지에 대해 지시 받고 싶어합니다.
왜냐하면 여러분이 그것이 하는 것을 깨닫지 못하면
이것은 여러분을 확실히 혼란스럽게 하는 것이 될 수 있기 때문입니다.
그리고 여러분은 그것이 옳은 것을 하고 있는지 확실히 지시해야 합니다.
좋아요.
여러분이 볼 다른 것들 중 하나는
이상한 의미를 가지는 연산자들입니다.
그리고 다시, 우리가 본 것을 생각해봐요 – 네?
그래서, 문자열 A가 3보다 작다는 것은
네.
제가 말하는 것은, 미안합니다.
답변은, 저는 그것이 ASCII인지 모르겠어요.
존, 그것이 내부에서 ASCII로
인코딩 됩니까?
저는 그렇다고 가정하겠습니다.
그래서, 여러분이 질문이 무엇인지 이해하지 못하는 경우에,
기본적으로 모든 기호는 기계 내부에서 문자열이나
특정한 인코딩으로 변환됩니다.
ASCII라는 특정한 것이 있는데,
그것은 기계가 사실 여기 내부에서 비교하는 것입니다.
ASCII 하에서 숫자로 인코딩하는 것은
문자 후에 나타날 것입니다,
그리고 여러분은 이상한 것을 얻게 될 것입니다.
좋아요.
저는 다른 것들을 몇 가지 해보고 싶습니다, 여러분에게 빠르게 상기시키기 위해,
그것들 중 하나는, 기억하세요, 연산자는 타입을 봅니다,
예를 들어 9 나누기 5는 1입니다
왜냐하면 이것은 인티져(정수) 나누기이기 때문입니다.
즉, 그것은 5에서 9로 가는 가증 큰 배수입니다.
그리고 나머지가 있는데,
4입니다.
그리고 다시, 여러분은 여러분이 연산자를 어떻게
사용하는 지에 대해 주의해야 합니다.
좋아요, 그것을 다 했으니까, 우리는 더 복잡한 것들을 들어 갈 수 있습니다,
그래서 예를 들어, 제가 그 명령문을
본다고 가정해 보세요.
3 더하기 4 곱하기 5.
좋아요.
이제,
여기 두 가지 가능한 값들이 있습니다.
하나는 23이고, 다른 하나는 35입니다.
왜냐하면 이것은 3 더하기 4, 곱하기 5가 될 수도 있고,
3, 더하기 4 곱하기 5가 될 수 도 있기 때문입니다.
그리고 물론, 여러분이 코드를 볼 때 그것은 사이에서
멈추지 않습니다.
그러면 제가 무엇을 하나요?
저는 분리했습니다, 제가 덧셈을 먼저 하나요
곱셈을 먼저 하나요?
이 경우에 무슨 일이 일어 나는지 아는 학생 있나요?
네, 오 저는 저기서
던질 뻔 했어요.
연산자의 기준 순서대로요, 저는
곱셈을 먼저하고, 3을 더한다고 생각합니다.
저는 건네 줄 누군가가
있으면 해요, 후아!
저는 누군가의 머리를 때립니다.
그것을 다른 사람에게 건네주세요.
여러분이 사탕을 원하면, 더 가까이 앉으세요, 그렇게 하면
우리가 어울리는 것뿐만 아니라 여러분을 기억할 수 있습니다.
그래서 핵심은, 여기 연산자 프로시저라는
것이 있다는 것입니다, 이것은 신사가 말한 것이지요.
저는 이것에 대해 더 이야기 하지 않을 것이지만, 기본적으로
이것이 말하는 것은, 같은 모든 다른 것들로, 멱법은
곱셈이나 나눗셈 전에 행해지고,
곱셈이나 나눗셈은 덧셈과 뺄셈
같은 것 전에 행해집니다.
그리고, 사실, 제가 다른 버전을 원하면,
사실, 제가 이것을 옳게 한다면, 이것은 저에게 23을 줍니다. 왜냐하면
곱셈이 먼저니까요. 제거 다른 버전을 원하면,
저는 괄호를 사용해서 말해주어야
합니다.
그리고 일반적으로, 제가 말하는 것은,
의심이 들 때는, 괄호를 사용하세요.
좋아요.
이제, 이것은 우리에게 명령문들을 줍니다.
우리는 복잡한 명령문들을 가지기 시작할 수 있습니다, 여러분은 우리가
많은 괄호들과 그 안에 모든 것들을 가질 수 있다고
상상할 수 있습니다.
네, 질문하세요.
9와 5의 나머지를 계산할 때 사용한
잘 안 보인다면, 폰트 크기를
네, 이것은 퍼센트에요, 그래서 이 퍼센트 기호가
여러분에게 나머지를 구해줍니다.
좋아요.
제가 하려고 하는 두 번째 것은,
제가 값들을 얻을 때, 저는 그것들을 계속하고 싶습니다.
저는 그것들에 이름을 주고 싶고, 그것들을
다른 곳에서 부를 수 있습니다.
그리고 또한 우리가 볼 수 있습니다. 여기서 우리가 가지는 마지막 것은 변수들을 만들어 내는
능력입니다. 변수들은 그들의 값을 가지고 있고,
대입문을 사용하여 행해집니다.
그래서 특히, 이것은 대입문 입니다.
이름 x를 구해서 부 명령문의 값으로
바인딩을 만듭니다. 그리고 사실
이것을 하기 위해서, 강조하고 싶은 포인트는, 이렇게 해봅시다.
이것은 단지 숫자가 아닙니다. 이것은 어떤 명령문입니다.
파이썬이 할 것은 우리가 이야기 했던 법칙들을 사용해서 그 명령문을 평가합니다.
그리고 나서 그것은 그 값으로
x의 바인딩을 만들어 냅니다.
그리고 저는 이것을 강조하고 싶습니다, 우리는 나중에 이것을 다시 다룰 것입니다.
그래서 지금은 제가 여러분이 이것에 대해 생각하길 바라는 방법은,
기계 어딘가에서,
모든 가능한 값들을 포함하는 큰 공간이 있습니다.
약간 거짓말이에요, 모든 가능한 값들을 가질 수는 없어요,
그렇지만 여러분은 생각을 할 수 있습니다.
그것은 지적으로, 모든
가능한 값들을 가집니다.
그리고 제가 바인딩을 만들 때, 이 x의 경우에,
저는 테이블 어딘가에 저장된 변수 이름을 가집니다,
그리고 그 이름으로부터 그 값으로 핑크나 포인터를 만들 것입니다.
이것이 뉘앙스입니다.
이것은 우리가 다른 언어로의 변화를 소개할 때
나중에 더욱 이해가 될 것입니다. 그렇지만
그것을 우리가 무엇을 담아두는 특정한 상자로 생각하지 마세요;
그것을 값의 링크로 생각하세요.
예를 들어, 저는 다른 대입문을 가질 수 있습니다,
그리고 그것은 y로부터 같은 값으로 바인딩을 만듭니다,
그리고 conservist로써 제가 할 수 있는 그것들 중 하나는,
저는 z가 x의 값이 되는 것과 같은 식을 가질 수 있습니다.
그리고 그것은 고의적으로 그렇게 했습니다.
그 식은 이 링크인 x의 값을 가져와서,
z에게 같은 곳에 포인터를 준다고 말합니다.
값에게요, x가 아닙니다.
좋아요, 그리고 우리는 그 생각을 하게 될 것입니다,
우리는 계속 해 가면서, 나중에 다시 돌아 올 것입니다.
좋아요.
우리가 변수들을 가지면, 우리가 할 수 있는 질문 중 하나는,
변수의 타입이 무엇인지 입니다.
다른 질문은 그것은 그것의 값으로부터 상속합니다.
좋아요.
네.
제 코드 어딘가에서, 제가 그 식,
그 대입문을 가지면, 지금 x는
그것의 값이 인티져인 변수 입니다.
불행히도, 적어도 우리 마음 속에, 파이썬에서, 이러한 변수 바인딩은
동적입니다, 또는 다소, 타입이 동적입니다.
이것이 의미하는 것은, 그것은 현재 값이 무엇인지에 따라 바뀝니다.
또는 다른 방법으로 말하면, 나중에 제가 이것을 하는 프로그램에서 어딘가에,
지금 x는 그것의 타입을
INT에서 문자열로 바꿉니다.
이제 여러분이 왜 신경 써야 합니까?
네, 제 견해는, 저는 그것을 좋아하지 않습니다.
특히 오버로드 된 연산자의 경우에요.
왜냐하면 제가 인티져 값을 가지는
특정 변수를 예상한 곳에서
어떤 코드를 썼을 지도 모르니까요.
나중에 코드의 어딘가에서
그것이 문자열로 이동하면,
저에게 있어 그것을 추적하는 것은
정말 어려운 일이 될 것이에요.
제가 제안하고 싶은 것 중 하나는
여러분이 여기서 좋은 스타일을 만들어야 한다는 것입니다, 그리고 특히,
타입을 제멋대로 바꾸지 마세요.
제가 오늘 철자를 쓸 수 는 없습니다.
무슨 말이냐 하면, 여러분이 이것이 필요할 때, 일반적으로 –
적어도 제 생각은 저는 그렇기 않지만, 존, 동의하나요? –
여러분은 이것을 하길 원하지 않습니다.
여러분은 이러한 변화를 만들길 원하지 않아요.
그것은 문제를 일으킬 것이에요.
좋아요.
이제, 변수에 대한 마지막 것인데, 그리고 나서 우리는
이것에 집어 넣길 시작할 것입니다, 마지막 것은 여러분은 어디서 그것을 사용할 수 있습니까?
제 답변은, 여러분은 여러분이 값을 사용하길 원하는
어디서나 변수를 사용할 수 있습니다.
그래서, 변수를 사용하는 것은 어디서나 허용됩니다.
좋아요.
이제,
이것은 우리가 가속화 하도록 도와 주고 몇 가지
자세한 것을 더하는 것입니다.
우리가 지금 정말 원하는 것은 이것을
사용하길 시작하는 것 입니다.
그래서, 연산자입니다.
이 명령문을 가져 와서, 변수들을 가져 오고, 우리는 그것을 다른 곳에 저장할 수 있습니다,
그러나 궁극적으로 우리가 원하는 것은,
우리는 지금 우리가
파이썬이나 어떤 다른 프로그래밍 언어 내부에 할 수 있는 것에 대해 이야기를 시작해야 합니다.
그것들을 조작하기 위해서요.
그리고 그것을 위해, 우리는 문장을 가질 것입니다.
여러분이 그것에 대해 생각하길 원한다면, 문장은 기본적으로 합법적입니다,
그리고 제가 어디서 잘 못 사용한 것을 제외하고는
명령문을 사용하려고 했습니다.
그래서 파이썬의 합법적인 명령들은 해석할 수 있습니다.
여러분은 이미 그것 들 중 몇 가지를 보았습니다.
출력, 대입, 분명히 두 명백한 식은 무언 가를
하도록 명령합니다.
대입은 값으로 이름을 바인딩 합니다.
출력은 그것을 화면에 찍어줍니다.
명백히 여러분이 그것을 내놓는 방법으로 출력하면,
우리는 입력을 가지는 방법을 예상합니다,
우리는 곧 그 예를 보게 될 것입니다.
그리고 우리가 다음 강의들을 하면서,
우리는 이 문장들에 더욱 더 추가할 것입니다.
그러나 우리가 이것을 가지고 무엇을 할 수 있을지 봅시다, 알겠죠?
그리고 이것을 하기 위해, 저는
제가 이미 타이핑한 코드를 사용할 것입니다.
그래서 저는 여러분이 그것을 읽을 수 있었으면 좋겠어요, 그리고 그것은
또한 여러분의 핸드아웃에 있습니다.
이것은 제가 만든 작은 파일입니다, 좋아요, 그리고 저는
이것들의 순서를 가지고 시작할 것입니다. 그리고 그것들과 같이 해 갈 것입니다,
다시 저는 여러분을 그 핸드아웃의 명령들을 시작하는 것으로 초대합니다.
우리가 할 것이 무엇인지 따라올 수 있도록요.
알겠죠?
이것의 첫 번째 부분을 봅시다.
좋아요, 이것은 텍스트 파일입니다.
그리고 저는 거기서 시작할 부분을
파란색으로 강조했습니다. 저는 그것으로 시작할 것입니다.
그리고 제가 무엇을 가지고 있습니까?
저는 명령들의 순서를 가지고 있습니다; 저는 대입문을 가지고 있습니다,
저는 다른 대입문을 가지고 있습니다,
저는 출력식을 가지고 있습니다, 저는 입력식을 가지고 있습니다,
우리는 곧 다시 돌아 올 거에요.
그리고 저는 기본적으로 이것들과 무엇을 하기 위해
이것들을 사용하길 시도하고 싶습니다.
제가 주목 할 두 번째 것은 작은 해쉬 마크 또는
파운드 기호입니다, 그것은 comment 를 식별합니다.
그래서 comment가 무엇이죠?
그것은 여러분의 또는 코드를 읽는 사람의 단어들입니다.
그것들은 여러분에게 이 코드 내부에서 무엇이 일어나는지 알려줍니다.
알겠죠?
이제, 이 comment는, 솔직히, 뇌가 손상되었거나
컴퓨터적으로 도전되었습니다.
무슨 말이냐 하면, 저는 왜 읽는 사람에게 제가
x를 값 3으로 바인딩 할 것이라는 것을 말해야 하죠?
저는 포인터를 만들기 위해 그것들을 그곳에 집어넣습니다.
일반적으로, 좋은 프로그래밍 스타일은 여러분이 comment에
여러분이 독자에게 코드 안에 무엇이 있는지 이해하기 쉽도록 도와주는
귀중한 것이 될 것을 집어 넣는 것을 말합니다.
그것은 이 코드 이면의 직관이
될 것입니다.
그것은 제가 입력에 가지고 싶은 전제 조건들일 수도 있습니다.
그것은 여러분이 하는 특정한 것들에 대핸 설명들일 수도 있습니다.
그러나 여러분은 이 comment들을 가져야 합니다.
이제, 이것은 강의의 사과 파이와 어머니인
상태의 하나가 되었습니다.
여러분의 어머니는 여러분에게 항상 방울 양배추를 먹으라고 말합니다.
그것이 여러분에게 좋으니까요.
이것은 방울 양배추 comment 입니다. 모두
예, 예, 예, 물론 comment입니다. 물론
우리는 comment를 할 것입니다.
그리고 그들은 절대 하지 않습니다.
그래서 저의 여러분에 대한 도전입니다, 그리고 구탁 교수가 이것을 할 수 있습니다,
저의 여러분에 대한 도전은 지금으로부터 1년 후에 돌아와서
여기 여러분이 쓴 코드를 보는 것입니다.
여러분이 무엇을 하려고 했는지 여전히 이해할 수 있겠습니까?
저는 모르겠어요, 존. 여러분이 동의한다면요, 그렇죠?
여러분이 1년 후에 그 코드를 읽을 수 있다면, 심지어 여러분이 스스로 쓴 코드를요,
그것은 여러분이 좋은 comment를 넣었다는 좋은 신호입니다,
그렇죠?
여기 두 번째 좋은 스타일은 변수 이름 선택입니다.
이것은 엉망입니다.
의도적으로요.
저는 x와 y와 z와 같은 간단한 것을 사용할 것입니다. 왜냐하면
저는 강의를 하면서 그것을
만들고 싶어요.
그러나 일반적으로, 변수 이름 선택은 여러분의 코드를 쓰는
훌륭한 방법입니다.
말이 되는 변수 이름을 사용하세요.
그 작은 문제 세트 0이 여러분이 한 것입니다.
여러분은 값들을 읽을 수 있습니다,
여러분은 아마 그것들을 저장해 두었을 것입니다. 제 생각으로는 여러분이 x와 y와 같은 간단한 이름을 사용했을 것 같아요.
더 좋은 이름은 여러분에게 여러분이 무엇을 하려고 했는지 말해주는
변수의 이름으로써, 성, 이름과
같은 것입니다.
좋아요.
제가 변수 이름에 대해 말하려고 한 다른 부분은,
제가 변수 이름을 한 번 선택하면, 저는 그것을 사용할 수 있습니다,
그러나 사실 변수 이름의 관점에서 제가 사용할 수 없는
몇 가지가 있습니다.
이것은 기록의 중요한 방법입니다, 그러나
배제된 몇 가지가 있습니다.
그리고 특히, 파이썬이 배제되어야 하는 것을
사용 하는 키 워드도 있습니다.
그것을 강조하고 싶군요. 제
가 말한 대로, 지금 이것은 단지 텍스트 파일입니다.
저는 이것을 저장할 것입니다 – 네, 그 방법이 아니에요,
저는 이렇게 저장할 것입니다 – 아래에 적은 문자 또는 접미사로요,
파이썬 파일로 만들기 위해 py로 하겠습니다.
네, 그리고 저는 이미 알고 있지만 그것을 할 것입니다,
그리고 몇 가지 환상적인 색을 얻게 됩니다.
그러나 이것은 중요합니다, 알겠죠?
제가 지금 하는 것에 주목하세요.
Comment는 빨간색으로 나타납니다.
저는 그것들을 볼 수 있어요.
제가 여기서 강조할 키워드가 있습니다,
저는 무슨 색인지 모르겠어요,
오렌지 인가요?
함수는 보라색입니다, 문자열은 초록색입니다,
그리고 대입문은 검정색입니다.
print 는 키워드입니다.
그것은 파이썬이 무엇을 하도록 하는 명령입니다. 결
과적으로, 저는 그것을 변수 이름으로 사용할 수 없습니다.
좋아요, 그것에 대해 잠깐 생각해 보세요.
제가 print를 변수 이름으로 사용하길 원하면,
어떻게 시스템이 결정하도록 할 수 있나요,
제가 무언가의 값으로써 프린트하길 원하거나 또는 명령문으로써 프린트하길 원하면요?
그래서 차단 된 것들의 순서가 있습니다, 그리고 저는 –
존, 제 생각에 무엇이 있는 거 같은데, 28?
그와 같은 것일 거에요, 조교들, 맞나요?
28 키워드는 차단되었나요?
우리는 우리가 해 나가면서 찾을 것입니다.
좋아요.
지금 이것을 다 했으니까, 저는 간단히 앞으로 가서 이것을 실행할 수 있습니다,
그리고 사실 제가 여기서 실행하려면,
여러분은 모듈을 검사할 옵션 둘을 볼 것입니다, 그러나 이 경우엔
그냥 실행할 것입니다.
오, 무엇이 일어나는지 주목하세요.
명령문의 순서로 실행합니다, 특히 그것은 x와 값 3을 묶어 줍니다,
그리고 나서 x 곱하기 x를 가져와서
x 를 곱한 x의 값을 가져옵니다, 그것은 물론 9입니다, x 값이에요,
그리고 나서 그 값을 찍어줍니다,
그러면 이제 여기 앉아서 입력을 기다립니다.
여러분은 그것이 무엇을 했는지 주목하세요, 그것은 그 작은 것을 출력했습니다,
여기서 숫자를 쳐서 이것이 프린트된 것입니다,
그래서 저는 숫자를 칠 수 있고 그것이 프린트 됩니다.
좋아요.
다시 실행 해 봅시다.
사실 그것을 위해, 저는 운 좋게도, F5 기능을 사용할 수 있습니다,
그것은 작동하지 않았습니다, 다시 해 볼게요, 여기 해 봅시다.
우리는 그 모듈을 실행할 것입니다.
좋아요.
후아.
무슨 일이 일어났죠?
저는 그렇게 하지 않았어요.
그리고 그것은 여전히 그것을 가져옵니다.
그리고 프린트되었어요.
자, 이것은 그것들이 무엇을 하는지 강조하는 것으로 돌아오길
바라는 곳 중 하나이죠?
제 식이 숫자를 입력하더라고, 특히,
여기 입력은 단지 문자 세트를 가져와서 그것을
문자열로 취급합니다.
그리고 나서 그것을 찍어줍니다.
그래서 사실 제가 이것이 숫자였다는 것을 확실히 하고 싶었다면,
저는 그것을 숫자로 변환했어야 합니다,
물론 여기서 실패했지만 어디에서 말하는지
검사하는 것을 입력하세요.
그래서 이것은 여러분에게 상기시키는 방법입니다,
저는 제가 입력한 것의 타입에 대해 주의해야 합니다.
좋아요.
이것은 여전히 지루하네요, 가속 페달을 밟아 봅시다.
제가 지금 하는 것은 다음과 같습니다: 저는 명령문을 쓸 수 있고,
값을 얻기 위해 그것들을 조합하고, 저장해서,
프린트 할 수 있습니다.
그러나 이 단계에서 문자 그래도 제가 할 수 있는 모든 것은
직선의 프로그램이라는 것을 쓰는 것입니다, 즉,
우리가 하나씩 순서대로 실행하는
프로그램을 말합니다.
단지 그 리스트를 따라 걸으세요.
우리는 그 리스트를 따라 걸었습니다.
이것은 지루합니다.
사실, 여러분은 여러분이 직선 프로그램으로 계산 할 수 있는
함수의 클래스가 무엇인지 입증하기 위해 좋은 것들을 할 수 있습니다.
그리고 여러분이 한다면, 여러분이 보는 것은
특별히 흥미롭지 않습니다.
좋아요.
돌아가서 우리의 레시피에 대해 생각해 봅시다.
우리가 여기서 무엇을 우리의 동기로 사용했나요?
실제 레시피에서도, 여러분은,
필요하다면, 설탕을 추가하는 것과 같은 것을 가집니다.
그것이 결정입니다.
그것은 조건문 입니다.
그것은 branch입니다.
그것이 맞다면, 그것을 하세요.
다시 말해, 다른 것을 하세요.
이것에 실제로 더하기 위해, 우리는 branch 프로그램을
가져야 합니다.
제가 말하는 것은 즉, branch 프로그램은
어떤 세트에 기반하여 명령문의 순서를 바꿀 수
있는 것입니다.
그리고 그 테스트는 보통 변수의 값입니다.
좋아요.
그리고 이것은 전체적으로 더욱 흥미로워집니다.
그래서 작은 예제를 봅시다, 이것은, 잠시만요,
우리가 여기 내부의 제어 흐름으로써 가지길 원하는 것뿐 만
아니라 문법을 소개해 줍니다.
그래서 여기로 돌아가서 그 부분을 comment 하겠습니다,
그리고 이 부분을 uncomment 해 봅시다.
저는 코드를 약간 쓸 것입니다.
이것은 짝수나 홀수로 프린트 될 것입니다, 제가 어떤 값을 넣었는지에 따라서요,
이 경우에, x는 짝수나 홀수입니다.
그것에 대해 생각해 보세요.
이것이 특정한 값을 가진다면, 저는 한 가지를 하고 있습니다;
다시 말해, 저는 다른 것을 하고 싶습니다.
그리고 이것의 문법을 봅시다.
이것은 우리가 볼 조건문의
첫 번째입니다.
형태를 주목하세요.
저는 저기로 올라 가겠습니다.
여기 첫 번째 문장은 대입문 입니다.
저는 x에 어떤 값을 줄 것입니다.
우리는 다른 것을 할 수 있습니다.
그리고 나서, 여기 구조에 대해 주목하세요.
다음 세 문장입니다.
먼저, IF는 키워드 입니다. 말이 되죠.
저기서 여러분이 볼 수 있듯이, 다음에 어떤 명령문이 나오고
콜론이 나옵니다.
그리고 사실, 그 콜론은 중요해요,
여기서 이것을 강조하고 싶군요.
콜론은 중요합니다.
이것은 명령문 블록의 시작을 정의합니다.
네.
테스트에 기반합니다.
보통 변수의 값입니다.
좋아요, 제가 있는 곳으로 돌아가 봅시다.
저는 코드에서 살펴 볼 것입니다.
그 콜론이 말하는 것은, 저는 제가 블록으로 다루고 싶은
명령문의 순서를 시작하려고 합니다.
그래서 그것은 명령문의 블록을 식별합니다.
그리고 특히, 콜론은 시작이고,
캐리지 리턴이 끝입니다.
이제 그것이 무엇을 말하죠?
저는 여기 많은 단어들을 하고 있습니다, 이것을
약간 더 낫게 해 봅시다.
그 코드는 다음을 말해 줍니다: IF는, 제가 명령문을 가지면,
저는 그것을 평가할 것이라는 것을 말합니다.
그 값이 옳으면, 저는 어떤 일들을 합니다.
그리고 그 일들은 여기 이것, 들여 쓴 명령문의
순서에 의해 식별됩니다.
다음에 콜론이 나오지만 그 전에 저는 들여 쓰기의 관점에서 같은 곳으로
돌아갑니다.
그 테스트가 옳지 않으면, 저는 이 명령문을 스킵 합니다,
그리고 두 번째 다른 키워드가 있습니다, 다음에 콜론이 나오고,
그것은 저에게 제가 그것이 틀린 경우에 무엇을
원하는지 말해줍니다.
그래서 사실 제가 이것을 실행하면, 아, 저장하세요,
그러면 홀수를 프린트합니다.
그래서, 여기 무슨 일이 일어나죠?
자, 코드를 봅시다.
네? X는 처음에 15여야 합니다.
저는 IF로 들어 가겠습니다.
IF는 다음 명령문을 평가하라고 말합니다.
그 다음 명령문에서, 저는 사실 제가 여기 인티져 곱셈과
나눗셈을 하는 사실의
이점을 갖습니다.
좋아요, 나누기는, x가 인티져이고 2는 인티져입니다,
그것은 무엇을 합니까?
x가 짝수이면, 2 로 나눈 x는 사실 x의 절반이 될 것입니다,
그렇죠?
x가 홀수이면, 그 인티져 나눗셈은 저에게 2의 배수의 수를 줍니다,
x로 들어가서, 나머지를 더합니다,
그것은 제가 버릴 것입니다.
두 경우에, 저는 값을 가져와서 2를 곱합니다,
원래 수가 짝수이면, 홀수이면, 저는 원래 수로 돌아갈 수 없을 것입니다,
그래서 저는 그것이 같은지
검사할 수 있습니다.
좋아요, 그래서 저기서 제가 사용할 작은 뉘앙스가 있습니다.
그래서, IF가 하는 첫 번째 것은, 그 명령문을 평가하는 것입니다.
그것이 옳으면, 다음 것을 합니다,
콜론 다음 것을 것.
그것이 옳지 않으면, 스킵 하고 내려 가서
홀수를 출력한 것을 평가합니다.
고마워요.
저는 누군가가 그 질문을 해주길 바랬어요.
질문은, 제가 들을 수 없으면,
왜 제가 두 등부호를 가져야 하죠?
그것은 제가 이것을 하는 것과 같습니다, 그렇죠?
누군가는 se--%uFFFD 를 갖습니다, 왜 제가 등부호를 사용하지 않나요?
저는 그것이 무엇과 같은지 알고 싶어요.
네.
절대적으로요.
등부호는 바인드 할 것입니다. – 좋은 지적이에요.
존, 이것은 더욱 재미있군요, 사탕을 던질게요.
저는 우리가 이것을 더욱 자주 해야 한다고 생각해요 – 좋아요.
핵심으로 들어가 봅시다.
등부호는 무엇을 합니까?
그것은 대입을 합니다.
왼쪽에 이것을 가지고 오른쪽에 값으로 바인드 하기 위해
이름으로 그것을 사용합니다.
이미 대입으로 등부호를 사용했기 때문에,
저는 비교할 다른 것이 필요합니다.
그리고 그것은 제가 등부호 두 개를 사용하는 이유입니다.
이 두 등부호는 값에서,
이것이 다른 쪽의 것과 같은 것입니까?
좋아요.
이제, 이것을 다 했으니, 다시 저는 이 생각을 강조하고 싶군요.
그리고 이것을 더욱 자주 쓸 것입니다.
여기 특정한 포맷이 있습니다.
그래서 우리가 IF를 가지고, 그것이 다음에 나오면, 저는 여기 중괄호를 사용할 것입니다,
여기에 오는 것을 나타내기 위해서요,
콜론 다음에 나오는 테스트를요.
그것은 명령문의 블록 다음에 나옵니다.
그리고 우리는 다른 명령문의 블록에서 콜론 다음에 나오는
ELSE를 가집니다.
그리고 저는 여러분이 이것에 익숙해 졌으면 합니다, 그 콜론은 중요해요,
그것은 시작을 식별합니다. 그리고 나서 들여 쓴 것들이 같은 단계에서
모든 다른 것들을 식별합니다, 그리고 우리가 전 단계로
다시 돌아 왔을 때, 그것은 우리가 있는 곳으로
돌아 온 때입니다.
좋아요.
이제, 이것은 좋은 간단한 작은 테스트입니다,
이것이 무엇을 하는지 느낌을 가지기 위해 다른 예들을 몇 가지 보겠습니다.
좋아요, 이것을 comment 해 보겠습니다, 그리고 이 다음
작은 코드를 봅시다.
좋아요.
저는 z를 어떤 값으로 바인딩 할 것입니다,
그리고 나서 이것을 실행할 것입니다.
자, 이것을 실행하고 그것이 무엇인지 봅시다.
아무 것도 아니군요.
좋아요, 왜 그렇죠?
자, 그것을 봅시다.
저는 테스트를 할 것입니다. 문자열 x가 b의 값 보다 작으면,
그리고 x가 문자열로써 b 전에 나타나지 않으면,
저는 오, 몇 가지를 할 것입니다.
왜냐하면 그것들은 같은 블록 단계에 있으니까요.
그것이 옳지 않다는 것을 고려해 볼 때, 그것은 아무 것도 아닙니다.
이제, 잠깐 기다리세요, 여러분은 ELSE 절은 어디 있죠? 라고 말할 수 있습니다.
그리고 답은, 저는 그것이 필요하지 않습니다.
좋아요, 이것이 순수하게 테스트이면, 이것이 제가 신경 쓰지 않으면 옳다면,
저는 거기서 그것을 식별하기 위해 ELSE 절이
필요합니다.
알겠죠?
제가 보고 싶은 두 번째 것은,
제가 그것을 그 아래 것과 비교한다고 가정해 보세요.
웁스, 제가 하려던 게 아니네요.
그것을 comment 하세요, 이것을 uncomment 합시다.
네, 저는 여전히 z의 바인딩을 갖습니다. 그리고 저는 그것을 같은 테스트에 줄 것이지만,
지금은 제가 두 같은 명령문을 갖지만 그것들이 다른 들여 쓰기를 갖는 다는 것에
주목하세요.
이 경우에, 사실 저는 다른 행동을 합니다.
왜죠? 그 볼록이
제가 테스트가 옳은지 하려는 것을
식별하기 때문입니다.
테스트가 옳지 않으면 Mon을 프린트하는
그 마지막 명령문이 이제 IF로써 같은 단계에서 뒤에 있다는 것에 주목하세요,
그래서 이것은 IF가 테스트하는 것입니다. 테스트를 다 하면,
그것은 제가 그 아래 블록에서 아무것도 하지 않을 것이라는 것을 결정합니다,
그러므로 저는 아래로 스킵 해서
IF로써 같은 단계의 다음 명령문으로 갑니다, 그것은 저에게
두 번째 프린트 문을 줍니다.
좋아요.
이제 우리는 이 다른 것들을 보고 있습니다, 우리가 여기서 할 수 있는
다른 것들이 무엇인지 봅시다.
약간 더 흥미로운 것을 해 봅시다. 그리고 나서
우리는 간단한 프로그램을 써 볼 것입니다.
그래서 저는 이것들을 comment 할 것이고, 이 코드 아래로 내려가 봅시다,
그리고 이것을 uncomment 합니다.
오 네, 이것은 훌륭했습니다.
이것을 다시 해 봅시다.
그리고 그것을 uncomment하고 그것을 다시 uncomment 해 봅시다.
좋아요, 그래서 여기 가장 작은 3의 값을 프린트 할
작은 코드가 있습니다.
그리고 이것이 보여주는 것은 IF들이 끼워 넣어 질 수 있다는 것에 주목하세요.
좋아요, 그것은 제가 그것을 보면, IF x 가 y 이면 이라고 말할 것입니다 –
미안해요, IF x 가 y 보다 작으면 입니다, 그러면 x가 z 보다 작은지 검사하세요,
그리고 그것이 옳으면, 가장 작은 x를
출력하세요.
그리고 그것의 구조에 주목하세요, 그것이 옳지 않으면
저는 다음 ELSE로 갈 것입니다, 그리고 가장 작은 z를 출력할 것입니다.
첫 번째 테스트가 옳지 않았으면, 저는 전체 블록을 스킵 할 것입니다
그리고 아래로 내려가서 가장 작은 y를 출력할 것입니다.
그래서 끼워 넣은 것에 주목하세요, 저는 그 테스트들이 실제 어떻게
일어 나는지를 통해 제 길을 갑니다.
좋아요, 이것을 런 해보고 무슨 일이 일어 나는지 봅시다.
좋아요. Y는 가장 작습니다.
이 코드가 맞습니까?
그것은 잠정적인 것 인가요?
네.
y와 비교해 보면 ...
네, 그것은 모든 비교를
하지 않습니다.
좋아요, 그리고 이것을 확인해 봅시다, 왜냐하면
이것의 핵심을 하고 싶으니까요, 올라 가서 다음을 해 봅시다.
Y를 가져와서, 그것을 13으로 바꿉시다. 런 해 봅시다, 음.
제가 여기서 무엇을 빠트렸나요?
두 가지 중요한 핵심이 있습니다.
첫 번째는, 제가 코드를 쓸 때, 특히 그것에 복제된 코드에서,
제가 코드를 위해 테스트 경우를 설계할 때, 저는 코드를 통한 각 가능한 경로를 위한
특정한 테스트 경우를 가지고
시도해야 합니다.
그리고 그렇게 함으로써, 저는 알아 내고, 여기 버그가 있습니다.
그리고 버그는 제 생각에 있습니다, 저는 모든 테스트를 위해
보지 않습니다.
그래서 제가 그것을 고치는 방법은, 그것을 comment 합니다,
그리고 그것을 계속합니다, 그것을 comment 합니다, 이것을 uncomment 합니다, 에 대해 이야기 할 것입니다.
여기 구조에 주목하세요.
저는 이제 많은 테스트를 가지고 있습니다.
그래서 사실, 그것을 그냥 실행하고 나서 우리는 그것이 무엇 인지에 대해
이야기 할 것입니다.
저는 이것을 실행합니다, 네, 저는 문법 오류가 있어야, 네 정말로요,
왜냐하면 제가 그 comment 하나를 잊어버렸네요,
그리고 단서는, 우리는 그것을 다시 해 볼 것입니다.
아하!
그리고 이것의 구조를 빠르게 봅시다.
이것은 이제 재미있는 것을 가집니다. IF x 가 y 보다 작고
AND x 가 z 보다 작으면, 무언 가를 합니다.
그리고 나서 그것은 ELIF 라는 이상한 것을 가집니다. 그것은 두 번째 테스트에서
else/if 를 위한 간단한 것입니다.
그래서 흐름의 관점에서 이것을 생각하는 방법은,
IF로 시작하고, 두 가지를 다 검사합니다.
그리고 두 가지라는 사실은
우리가 여기 Boolean 조합을 사용할 것이라는 것입니다.
우리는 어떤 논리적인 명령문을 가지고 그것을
AND, OR, NOT 으로 조합할 수 있습니다. 더 복잡한 명령문을 만들기 위해서요,
그리고 제 테스트로써 그 명령문의 값을 사용합니다.
그리고 그것은 문자 그대로 제가 거기서 했다는 것입니다, 좋아요, 저는 y 보다 작은 x를 갖습니다,
그것이 테스트 입니다,
그것은 오직 두 값을 가집니다,
true 와 false 이죠, 그리고 그 코드가 말하는 것은,
x가 y 보다 작으면, AND, 논리적으로,
제가 거기에 무엇을 집어 넣든, x는 z 보다 작습니다, 그러면 그 조합은 옳습니다,
그러므로 저는 그것을 할 것입니다.
그래서 AND는 두 인자가 모두 옳으면 옳고,
OR는 두 인자 중 하나가 옳으면 옳고, NOT은 인자가 옳지 않으면 옳습니다,
그리고 나서 마지막 것은, 저는 이제 제가 하고 싶은 것의
순서를 가질 수 있습니다.
그래서 이것이 다른 무엇을 하는 옳은 것이면,
그렇지 않으면 테스트를 하고 이것이 옳은지 봅니다, 다른 것을 해요,
마지막에 오는 가능한 많이요.
그리고 ELSE는, 여기서 제가 하길 원하는 것입니다.
좋아요.
이제,
이것에 더했으니, 저는 branching 명령문들을 가집니다.
저는 간단한 branching 프로그램을 가지고 있습니다.
이것들은 여전히 정말 간단합니다.
그리고 그들은 정말 간단해요 왜냐하면, 제가 지금 할 수 있는 모든 것은
어떤 코드나 다른 것을 실행할지 결정하는 것이거든요.
다른 방법으로 말하면, 직선 프로그램의 경우에,
그것은 프로그램을 실행 하는데 얼마나 걸리죠?
자, 기본적으로, 제가 많은 명령문을 가지고 있다 하더라도, 왜냐하면
저는 각 하나를 순서대로 하기 때문입니다.
간단한 branching과 함께, 그것은
코드를 실행 하는데 얼마나 걸릴까요?
많아 봐야, 각 명령문을 하나씩 실행할 것입니다.
왜냐하면 IF들이 그것이 옳으면 이것을 하고,
그렇지 않으면 스킵 하라고 말하니까요.
그러므로 간단한 branching 프로그램을 위해, 시간의 길이,
코드의 복잡성은 정수입니다.
즉, 그것은 기껏해야 명령문들의 실제 수의
길이입니다.
그것은 입력에 의존하지 않습니다.
정말 간단한 프로그램이죠.
다른 간단한 예를 해 봅시다.
제가 모든 MIT 교수진의 평균 나이를 계산하고
싶다고 가정해 보세요.
약 우리 천 명이 있어요.
제가 그것을 한다고 하더라도, 저는 그것이 선천적으로 시간이
더 많이 걸린다는 것을 압니다. 모든 EECS 교수진의 평균 나이를
계산하는 것보다요.
단 우리 125명이 있어요.
그리고 그것은 존과 내 나이와, 600 명의 강사의 평균을 구하는 것 보다
더 시간이 오래 걸릴 것입니다.
왜냐하면 두 명 밖에 없으니까요.
좋아요, 이 코드는 선천적으로
입력의 크기나 특정한 입력에 의존하는 것을
포함합니다.
그리고 이것은 우리가 돌아 올 컴퓨터적 복잡성의 생각에
대한 서문입니다.
우리가 여러분을 돕고 싶은 것 중 하나는 다른 알고리즘들의
클래스를 식별하는 것입니다. 그들의 비용은 무엇인지,
문제들을 더 효율적인 computation을 하는 클래스로
어떻게 보여주는지를요.
이제,
교수진의 평균 나이를 계산하는 것에 대해
잠깐 생각해 봅시다.
여러분은 이미 제가 무엇을 원하는지 볼 수 있어요.
저는 다소, 제가 자료 구조들의 순서를 따라 걷고 싶으면,
모으거나 같은 것을 하거나, 나이를 더합니다.
제가 총 나이를 얻고 교수진 수로
나눌 때 까지요.
제가 그것을 위한 코드를 어떻게 쓸 수 있죠?
자, 우리의 레시피의 시작점으로
돌아갑니다.
그리고 저는 여러분이 기억하지 못한다는 것을 확신해요,
그러나 제가 제 레시피에 가지고 있는 것 중 하나는 뻣뻣해 질 때까지 흰자를 섞는 것입니다.
좋아요.
그 때 까지라는 것은 중요한 단어에요.
그것은 사실 테스트를 정의합니다.
그것을 제가 원하는 것으로 더욱 자연스럽게 이끄는 잘 알아 들을 수 없는
영어로 바꾸어 말해 봅시다.
달걀 흰자가 뻣뻣하지 않으면, 그것들을 섞으세요.
그것은 다른 구조입니다.
그 안에 테스트를 가지면,
그 때까지 무엇을 하세요, 그러나 저는 그것을 계속하길 원합니다.
그리고 그것을 위해, 우리는 한 가지 마지막 것을 더해야 합니다.
그것은 반복문 입니다.
또는 루프입니다.
우리는 이것의 다양한 것들을 볼 것입니다. 우리는 조금 나중에
순환이라는 것을 볼 것이지만,
지금은 우리가 어떻게
반복문을 하는지 이야기 해 봅시다.
그리고 저는 여러분이게 이것의 예를 보여주고 싶어요,
문법과 의미 모두에 이르는 것을요.
그리고 그것을 comment 해 봅시다, 그리고 이것을 해 봅시다.
이 코드가 무엇을 말하죠?
그것이 하는 것이 아니라 그것이 말하는거요.
자, 첫 세 식은 단지
대입문 입니다.
저는 x와 y와 iters 을 어떤 값으로 왼쪽으로 바인딩합니다.
그리고 나서 구조에 주목하세요, 저는 WHILE 키워드를 가집니다,
그것을 식별하는 색이 있어요, 그리고 괄호 속에서 저는 테스트를 할 것입니다.
저는 Boolean이 되는 테스트를 하는 값을 기대합니다.
콜론 다음에 옵니다.
콜론은 코드의 블록을 식별합니다.
그리고 이것이 말하는 것은요.
왼쪽 변수 iters가 0 보다 큰 값을 가지는지
확인하세요.
그렇다면, 그 블록에서 각 명령문들을
실행하세요.
그래서 저는 y를 대입할 것입니다,
저는 왼쪽 iters를 대입할 것입니다.
저는 디버깅하기 위해 빌린 comment를 가집니다,
그리고 나서 제가 그것이 무엇을 하길 원하나요?
저는 그것이 테스트 주변으로 돌아 가길 원합니다.
다시 한번, 그 테스트가 옳습니까?
그것이 옳으면, 명령문들의 순서를 실행하세요.
그래서 사실 우리는 이것을 블록 짓고 그것이 무엇을 하는지 볼 수 있습니다.
제가 여기 작은 차트를 가지고 있으면, 저는 왼쪽에 x와 y와 iters 를 가집니다.
제 생각에 그렇게 되면 x가 시작합니다,
여기서 저는 읽을 수 없는데, x가 3이고, y가 0이고 iters가 3입니다.
저는 그것을 시뮬레이션 할 수 있어요.
왼쪽 iters의 값이 0 보다 큽니까?
그래서, 두 명령문을 실행합니다.
Y와 x의 값을 가지고, 둘을 더하세요,
그리고 그것을 새로운 변수 y로 만드세요.
그것이 대입입니다.
왼쪽 iters를 가지고,
그것으로부터 하나를 빼서, 새로운 변수 왼쪽 iters로 바인드합니다.
블록의 마지막에 다다르면, 돌아가서
테스트를 검사하세요.
왼쪽 iters의 값이 0 보다 큽니까?
네 그렇습니다.
그래서, 다시 명령문들을 같은 순서로 평가하세요. Y 더하기 x는 6입니다,
그것이 새로운 값 y 입니다, 2 빼기 1은 1입니다,
그것이 새로운 왼쪽 iters의 값입니다, 돌아 가세요.
왼쪽 iters의 값이 0 보다 큽니까?
네 그렇습니다.
그래서, 한 번 더 합니다, 신이시여 감사합니다 제가 47을 예로 들지 않았으니까요.
X 더하기 y 를 하고 왼쪽 iters로 부터 하나를 빼세요, 다시 테스트로 돌아갑니다.
왼쪽 iters의 값이 0 보다 큽니까?
아니요 그렇지 않습니다.
그러므로 코드 블록의 나머지는 스킵 하고
다음 명령문으로 갑니다, 그것은, 아, y를 프린트 하세요.
사실, 우리가 이것을 테스트하는 것은 골칫덩이에요.
간단한 제곱 프로시저를 가지세요,
좋아요, 이것은 인티져를 제곱해 줍니다. 그것이 이것이 하는 것이에요.
그러나 구조에 주목하세요.
이제 저는 루프를 만들 능력을 가집니다,
즉, 제가 계속 하면서 같은 코드를 다시
사용하기 위해서요.
그리고 이것을 더하세요,
이제, 제가 쓸 수 있는 코드가 많습니다.
제가 이것에 강조 하고 싶은 다른 것에 주목하세요.
알겠죠?
첫 번째는, 그 테스트는 포함해야 합니다 –
그래서는 안되지만 거의 항상 포함합니다 –
어떤 변수의 값을요.
제가 코드 내부의 어떤 변수의 값을 변화시키고 싶지
않으면 어떡하죠?
또는 다른 말로, 제가 이것을 했으면요?
그것을 Comment 하세요.
제가 이 것을 실행하면 어떻게 될까요?
네.
이것은 무한히 계속 됩니다.
절대적으로요, 그렇죠?
그것은 무한한 루프를 돕니다 –
저는 이 끝을 맞출 수 있다고 생각해요, 아, 아니죠, 할 수 없어요, 끔찍한 목표에요 –
좋아요,
다시 해봐요, 제가 여기서 하려는 핵심은 – 신이시여 감사해요
우리는 이 강의의 끝 무렵에 왔어요, 제 혀가 떨어지고 있습니다 --
제가 여기서 하려는 핵심은 그 테스트는 변하고 있는 어떤 루프 변수를
포함해야 한다는 것입니다.
그렇지 않으면 테스트는 항상 옳을 것입니다,
우리는 여기서 떨어질 것이지만, 이것은 제가 그것을 하면 무한히 루프를 돕니다.
두 번째 질문입니다: 또는 이것을 말하는 더 좋은 방법,
그리고 여러분이 여기서 보고 싶은 일반적인 포맷은 변수 이름을 포함하는 테스트입니다.
그것은 루프 밖에서 초기화되어야 합니다.
그리고 루프 내부가 바뀌어야 합니다,
그러면 테스트가 바뀔 것입니다.
여기 두 번째 질문입니다.
이것은 입력의 값, x의 값들을 위해
옳게 실행할 것입니까?
아마도 인티져일 것입니다, 그렇죠?
그렇지 않으면, 이것은 이상한 것을 할 것이에요,
그러나 모든 인티져들은요?
좋아요, 제가 이것을 한다고 가정해 보세요.
저의 마지막 예제입니다.
네, 이것은 어떻습니까, 네?
우리는 이것이 제곱을 한다는 것을 알고 있습니다, 그래서 지적으로
우리는 -4를 제곱할 수 있습니다. 그것은 16이 되어야 해요,
그런데 여기서 무슨 일이 일어나죠?
두 배의 이상한 손가락이에요.
그렇죠?
그것은 루프를 통해 실행할 것입니다, 그리고 답을 축적합니다,
그런데 제가 뺄 것이기 때문에, 그것은 계속 하면서
x를 더욱 더 음수로 만듭니다, 다시
무한 루프로 들어갑니다.
제가 입력으로부터 예상하는 것에 대해 코드를 쓸 때 생각해야 하는 것,
그리고 제가 그것들에게 강요해야 하는 것을
여러분에게 상기시키는 방법입니다.
이 경우에, 저는 아마 제가 그것을 계속 하기 전에
x의 절대 값을 사용하는 것을 확실히 하고 싶습니다.
네.
학생은 절대적으로 맞습니다, 왜냐하면 제가
iters를 바인드 했으니까요, 음,
사탕 두 개를 주겠어요.
제가 에러를 만든 것을 잡았군요.
네.
핵심은 이것은 작동하지 않을 것입니다.
그리고 이 학생이 그것을 잡아냈어요, 인상적이군요,
왼쪽 iters가 이미 음수이기 때문에 그것은 작동하지 않을 것입니다,
그것은 전체 루프를 스킵할 거에요. 그러면 저는 문제에 빠지겠죠, 잡아 줘서 고마워요.
예는 핸드아웃에 있을 겁니다, 그것은
여러분에게 우리가
다음 시간에 할
다른 버전을 보여줍니다.
주목할 핵심은, 저는 지금 반복문을 만들 능력이 있어요,
그것은 제가 할 수 있는 것을 확장하는 것입니다.
그리고 다음 시간에 봅시다.