1
1

00:00:00,620  -->  00:00:02,220
<v ->Hi guys, and welcome back.</v>
2

2

00:00:02,220  -->  00:00:04,400
In this video, we're going to talk about function,
3

3

00:00:04,400  -->  00:00:06,430
arguments and parameters.
4

4

00:00:06,430  -->  00:00:09,220
That is, how we can give our functions data
5

5

00:00:09,220  -->  00:00:10,940
so that they can use it.
6

6

00:00:10,940  -->  00:00:13,460
For example, the print function makes use of this
7

7

00:00:13,460  -->  00:00:15,920
so that it can accept a string to print out
8

8

00:00:15,920  -->  00:00:17,060
into the console.
9

9

00:00:17,060  -->  00:00:20,880
We're going to learn how to do that in our own functions.
10

10

00:00:20,880  -->  00:00:23,863
Let me define a function that has two parameters.
11

11

00:00:27,590  -->  00:00:29,800
What I've done here is I have created a function
12

12

00:00:29,800  -->  00:00:33,960
called add and inside the brackets I've put the names
13

13

00:00:33,960  -->  00:00:35,530
of its two parameters.
14

14

00:00:35,530  -->  00:00:38,210
So that's x and y.
15

15

00:00:38,210  -->  00:00:41,880
Notice that I have put the word pass inside the function
16

16

00:00:41,880  -->  00:00:45,680
body, and what that means in Python is do nothing.
17

17

00:00:45,680  -->  00:00:47,900
It is needed, at least something is needed
18

18

00:00:47,900  -->  00:00:49,960
inside a function because Python expects
19

19

00:00:49,960  -->  00:00:51,110
the indented block there.
20

20

00:00:51,110  -->  00:00:52,900
So that's why I've put that there, but it doesn't
21

21

00:00:52,900  -->  00:00:54,060
mean anything.
22

22

00:00:54,060  -->  00:00:57,700
We've got our two parameters here which are x and y.
23

23

00:00:57,700  -->  00:01:00,380
We have two parameters because they are two variable
24

24

00:01:00,380  -->  00:01:04,040
names separated by a comma and what happens is that when
25

25

00:01:04,040  -->  00:01:07,420
Python runs the function, when you call the function itself,
26

26

00:01:07,420  -->  00:01:11,080
these two variables are created and the function
27

27

00:01:11,080  -->  00:01:13,790
can use them inside the function body.
28

28

00:01:13,790  -->  00:01:15,400
When you get to the end of the function body,
29

29

00:01:15,400  -->  00:01:17,550
the variables disappear.
30

30

00:01:17,550  -->  00:01:20,550
So what are the values of x and y?
31

31

00:01:20,550  -->  00:01:23,160
Well, that depends on what you give the function
32

32

00:01:23,160  -->  00:01:24,010
when you call it.
33

33

00:01:24,010  -->  00:01:28,360
So for example, if you add and put five comma three,
34

34

00:01:28,360  -->  00:01:31,740
then these here are all called arguments.
35

35

00:01:31,740  -->  00:01:33,890
These here are called parameters.
36

36

00:01:33,890  -->  00:01:38,490
So each argument provides a value to one parameter.
37

37

00:01:38,490  -->  00:01:43,253
Five is the value of x, and three will be the value of y.
38

38

00:01:44,410  -->  00:01:47,060
Of course our add function doesn't do anything just now
39

39

00:01:47,060  -->  00:01:49,050
so we are going to make it do something.
40

40

00:01:49,050  -->  00:01:51,490
We're going to say result is x plus y,
41

41

00:01:51,490  -->  00:01:53,650
and then we're going to print result.
42

42

00:01:53,650  -->  00:01:57,270
So now we have it here our function with two parameters,
43

43

00:01:57,270  -->  00:02:00,280
and then our function call with two arguments.
44

44

00:02:00,280  -->  00:02:03,730
When the function call happens, these values get placed
45

45

00:02:03,730  -->  00:02:06,390
into these variables and the function runs.
46

46

00:02:06,390  -->  00:02:08,760
So here result will be eight
47

47

00:02:08,760  -->  00:02:09,940
and then we will print that out.
48

48

00:02:09,940  -->  00:02:12,880
So let me just run that for you, and you can see that eight
49

49

00:02:12,880  -->  00:02:14,113
comes out down there.
50

50

00:02:17,180  -->  00:02:18,420
Let's do another example.
51

51

00:02:18,420  -->  00:02:21,423
Now a function without any parameters.
52

52

00:02:22,960  -->  00:02:25,990
So if we have a function such as this say hello function
53

53

00:02:25,990  -->  00:02:27,440
that doesn't have any parameters,
54

54

00:02:27,440  -->  00:02:29,840
notice that the brackets are empty.
55

55

00:02:29,840  -->  00:02:31,460
You cannot give it arguments.
56

56

00:02:31,460  -->  00:02:34,410
So if you type say hello and you pass in Bob,
57

57

00:02:34,410  -->  00:02:38,250
this will fail in Python because you are passing an argument
58

58

00:02:38,250  -->  00:02:40,320
to a function that has no parameters.
59

59

00:02:40,320  -->  00:02:42,850
So if we run this, you'll see that it says
60

60

00:02:42,850  -->  00:02:45,330
say hello takes zero positional arguments,
61

61

00:02:45,330  -->  00:02:46,790
but one was given.
62

62

00:02:46,790  -->  00:02:49,070
We haven't looked at what positional arguments mean yet,
63

63

00:02:49,070  -->  00:02:51,360
but Bob is a positional argument.
64

64

00:02:51,360  -->  00:02:53,020
More on that later on.
65

65

00:02:53,020  -->  00:02:55,700
So we've given this function one positional argument,
66

66

00:02:55,700  -->  00:02:57,540
but this function doesn't take any.
67

67

00:02:57,540  -->  00:02:59,080
It doesn't have any parameters.
68

68

00:02:59,080  -->  00:03:01,430
So that's why the error happens.
69

69

00:03:01,430  -->  00:03:04,560
Similarly, if we instead decide to pass in a name,
70

70

00:03:04,560  -->  00:03:06,503
and we do something like this,
71

71

00:03:08,210  -->  00:03:11,370
now you can call the function with an argument.
72

72

00:03:11,370  -->  00:03:14,535
So if we run this, you'll see that we get "Hello, Bob"
73

73

00:03:14,535  -->  00:03:16,940
because this function prints the string "Hello"
74

74

00:03:16,940  -->  00:03:20,815
with the name variable inside it, but having a parameter
75

75

00:03:20,815  -->  00:03:23,540
means that you must pass in an argument.
76

76

00:03:23,540  -->  00:03:27,250
So you cannot call the function without an argument.
77

77

00:03:27,250  -->  00:03:31,930
If you do, it says that say hello is missing one required
78

78

00:03:31,930  -->  00:03:34,480
positional argument and then it gives you the name
79

79

00:03:34,480  -->  00:03:35,850
of the positional argument.
80

80

00:03:35,850  -->  00:03:38,570
So it's saying that you need to pass in a value
81

81

00:03:38,570  -->  00:03:41,640
for this name parameter, but you didn't.
82

82

00:03:41,640  -->  00:03:43,810
So you should.
83

83

00:03:43,810  -->  00:03:47,030
So when you put Bob in here, we've said that this is a
84

84

00:03:47,030  -->  00:03:50,170
positional argument, and the reason why it's called
85

85

00:03:50,170  -->  00:03:53,740
a positional argument is because if you have multiple
86

86

00:03:53,740  -->  00:03:58,740
arguments such as these two here, and then you call it
87

87

00:03:58,770  -->  00:04:02,700
like that, the only way Python has of determining
88

88

00:04:02,700  -->  00:04:06,450
which parameter takes which value is by position.
89

89

00:04:06,450  -->  00:04:09,990
So Bob is the first argument or in the first position.
90

90

00:04:09,990  -->  00:04:13,410
So the name parameter will take the value of Bob,
91

91

00:04:13,410  -->  00:04:15,520
and Smith is the second argument.
92

92

00:04:15,520  -->  00:04:19,020
So the second parameter will take the value of that.
93

93

00:04:19,020  -->  00:04:21,070
So these are called positional arguments
94

94

00:04:21,070  -->  00:04:23,070
because the position they're in will affect
95

95

00:04:23,070  -->  00:04:26,450
the value of its relevant parameter.
96

96

00:04:26,450  -->  00:04:30,040
However, Python also has arguments that are not positional.
97

97

00:04:30,040  -->  00:04:33,760
They are called keyword or named arguments.
98

98

00:04:33,760  -->  00:04:38,000
For example, you can do surname equal Bob
99

99

00:04:38,000  -->  00:04:40,285
and name equal Smith.
100

100

00:04:40,285  -->  00:04:43,710
Now Python will be able to tell that you want
101

101

00:04:43,710  -->  00:04:47,210
the surname parameter to take the value of Bob
102

102

00:04:47,210  -->  00:04:51,210
and the named parameter to take the value of Smith.
103

103

00:04:51,210  -->  00:04:55,450
These here are named or keyword arguments.
104

104

00:04:55,450  -->  00:04:58,190
Named or keyword arguments are really helpful
105

105

00:04:58,190  -->  00:05:01,280
because they allow us to very easily determine
106

106

00:05:01,280  -->  00:05:05,260
when we are reading this line here which argument
107

107

00:05:05,260  -->  00:05:07,940
is for which parameter, and indeed if we hadn't
108

108

00:05:07,940  -->  00:05:11,300
come across this function before, it would also tell us
109

109

00:05:11,300  -->  00:05:13,550
what the function does to some extent.
110

110

00:05:13,550  -->  00:05:15,540
If you read this line here, you can see that okay,
111

111

00:05:15,540  -->  00:05:17,680
you're going to say hello and you're taking a name
112

112

00:05:17,680  -->  00:05:19,720
and a surname, so you're probably going to print that out.
113

113

00:05:19,720  -->  00:05:22,250
That allows you to make some inferences about what this
114

114

00:05:22,250  -->  00:05:23,660
code is going to do.
115

115

00:05:23,660  -->  00:05:26,910
So this can be really helpful and it's very widely
116

116

00:05:26,910  -->  00:05:27,943
used in Python.
117

117

00:05:29,540  -->  00:05:32,630
For example, let's say that you've got a divide function
118

118

00:05:32,630  -->  00:05:36,030
where if the divisor is not zero, then you're going to print
119

119

00:05:36,030  -->  00:05:37,030
the dividend by the divisor.
120

120

00:05:37,030  -->  00:05:39,130
Otherwise, you're going to print something
121

121

00:05:39,130  -->  00:05:42,890
like "You fool," you can't divide something by zero.
122

122

00:05:42,890  -->  00:05:44,420
So we've got a function here.
123

123

00:05:44,420  -->  00:05:47,930
Then you can call this function divide with something
124

124

00:05:47,930  -->  00:05:50,230
like 15 and zero.
125

125

00:05:50,230  -->  00:05:52,130
So this may be okay.
126

126

00:05:52,130  -->  00:05:56,140
You can press play and you get back "you fool."
127

127

00:05:56,140  -->  00:06:00,730
However, it can be clearer if you tell the reader
128

128

00:06:00,730  -->  00:06:03,860
of this line which value is which.
129

129

00:06:03,860  -->  00:06:06,010
Now with something like division it may be obvious
130

130

00:06:06,010  -->  00:06:09,270
that 15 comma zero is going to divide 15 by zero.
131

131

00:06:09,270  -->  00:06:12,120
That seems reasonable to a reader I think,
132

132

00:06:12,120  -->  00:06:15,870
but, again, it can be cleared if you say dividend is 15,
133

133

00:06:15,870  -->  00:06:17,710
and divisor is zero.
134

134

00:06:17,710  -->  00:06:20,550
Notice that usually in Python we do not put spaces
135

135

00:06:20,550  -->  00:06:23,460
around this equal sign here when it's being used
136

136

00:06:23,460  -->  00:06:28,390
to separate a value from its keyword argument.
137

137

00:06:28,390  -->  00:06:30,610
As well as passing dividend and divisor like this,
138

138

00:06:30,610  -->  00:06:32,657
you could reverse them; put the divisor here
139

139

00:06:32,657  -->  00:06:34,300
and the dividend there and that would be fine,
140

140

00:06:34,300  -->  00:06:36,480
although maybe a little more bit confusing,
141

141

00:06:36,480  -->  00:06:40,420
but also not all arguments have to be keyword arguments.
142

142

00:06:40,420  -->  00:06:42,440
You can have some positional arguments
143

143

00:06:42,440  -->  00:06:46,230
and then some keyword arguments, but that's exactly it.
144

144

00:06:46,230  -->  00:06:48,480
The positional arguments have to go first
145

145

00:06:48,480  -->  00:06:50,770
and the keyword arguments have to go later.
146

146

00:06:50,770  -->  00:06:54,680
If you do dividend equal 15 and then you skip the keyword
147

147

00:06:54,680  -->  00:06:57,010
argument there, you're going to get an error and Python
148

148

00:06:57,010  -->  00:06:59,460
is going to tell you that a positional argument follows
149

149

00:06:59,460  -->  00:07:02,540
a keyword argument and that is illegal in Python.
150

150

00:07:02,540  -->  00:07:04,650
So the positional arguments have to go first,
151

151

00:07:04,650  -->  00:07:06,133
keyword arguments go later.
152

152

00:07:07,330  -->  00:07:10,410
I recommend that you use keyword arguments
153

153

00:07:10,410  -->  00:07:12,540
whenever possible just because you're going to make
154

154

00:07:12,540  -->  00:07:14,630
your code a little bit easier to read,
155

155

00:07:14,630  -->  00:07:17,300
unless it's really obvious what's going on.
156

156

00:07:17,300  -->  00:07:19,925
So for example, in a divide function, maybe you don't need
157

157

00:07:19,925  -->  00:07:21,780
the keyword arguments.
158

158

00:07:21,780  -->  00:07:24,220
Similarly, in a say hello function that just takes
159

159

00:07:24,220  -->  00:07:26,700
a person's name, you probably don't need keyword arguments
160

160

00:07:26,700  -->  00:07:29,860
either, but as soon as you start doing more complicated
161

161

00:07:29,860  -->  00:07:32,710
things or functions that are maybe not as obvious,
162

162

00:07:32,710  -->  00:07:34,490
using keyword arguments is really going to help.
163

163

00:07:34,490  -->  00:07:36,630
So I recommend that you use them.
164

164

00:07:36,630  -->  00:07:37,640
That's it for this video though.
165

165

00:07:37,640  -->  00:07:39,040
Thank you for joining me in this one,
166

166

00:07:39,040  -->  00:07:40,390
and I'll see you next time.
