Python中的函数


函数是应用程序最重要的方面。函数可以定义为可重用代码的有组织块,可以在需要时调用它。

Python允许我们将大型程序划分为称为函数的基本构建块。该函数包含由{}括起来的一组编程语句。可以多次调用函数以为python程序提供可重用性和模块性。


换句话说,我们可以说函数集合创建了一个程序。该函数也称为其他编程语言中的过程或子例程。


Python为我们提供了各种内置函数,如range()或print()。虽然,用户可以创建其功能,可以称为用户定义的功能。


python中函数的优点

函数有以下优点。


通过使用函数,我们可以避免在程序中一次又一次地重写相同的逻辑/代码。

我们可以在程序中和程序中的任何地方多次调用python函数。

当它被分成多个函数时,我们可以轻松地跟踪大型python程序。

可重用性是python函数的主要成就。

但是,函数调用总是在python程序中开销。

创建一个函数

在python中,我们可以使用def关键字来定义函数。下面给出了在python中定义函数的语法。


def my_function():

function-suite 

return <expression> 


函数块以冒号(:)开头,所有相同级别的块语句保持相同的缩进。


函数可以接受定义和函数调用中必须相同的任意数量的参数。

功能调用

在python中,必须在函数调用之前定义函数,否则python解释器会给出错误。一旦定义了函数,我们就可以从另一个函数或python提示符调用它。要调用该函数,请使用函数名称,后跟括号。


下面给出了一个打印消息“Hello Word”的简单函数。


def hello_world():
print("hello world")
hello_world()


输出:

hello world



功能中的参数

函数中的信息可以作为参数传递。参数在括号中指定。我们可以提供任意数量的参数,但我们必须用逗号分隔它们。


请考虑以下示例,其中包含一个接受字符串作为参数并打印它的函数。


例1

#defining the function
def func (name):
print("Hi ",name);
#calling the function 
func("Ayush")


例2

#python function to calculate the sum of two variables 
#defining the function
def sum (a,b):
return a+b;
#taking values from the user
a = int(input("Enter a: "))
b = int(input("Enter b: "))
#printing the sum of a and b
print("Sum = ",sum(a,b))


输出:


Enter a: 10
Enter b: 20
Sum =  30



在Python中通过引用调用

在python中,所有函数都通过引用调用,即,对函数内部引用所做的所有更改都将恢复为引用引用的原始值。


但是,在可变对象的情况下有一个例外,因为对像string这样的可变对象所做的更改不会恢复为原始字符串,而是创建一个新的字符串对象,因此会打印两个不同的对象。


示例1传递不可变对象(列表)

#defining the function
def change_list(list1):
list1.append(20);
list1.append(30);
print("list inside function = ",list1)
#defining the list
list1 = [10,30,40,50]
#calling the function 
change_list(list1);
print("list outside function = ",list1);


输出:


list inside function =  [10, 30, 40, 50, 20, 30]
list outside function =  [10, 30, 40, 50, 20, 30]



示例2传递可变对象(字符串)

#defining the function
def change_string (str):
str = str + " Hows you";
print("printing the string inside function :",str);
string1 = "Hi I am there"
#calling the function
change_string(string1)
print("printing the string outside function :",string1)


输出:


printing the string inside function : Hi I am there Hows you
printing the string outside function : Hi I am there



参数的类型

可能有几种类型的参数可以在函数调用时传递。

必需的参数

关键字参数

默认参数

可变长度参数

必需的参数

直到现在,我们已经了解了python中的函数调用。但是,我们可以在函数调用时提供参数。就所需的参数而言,这些是在函数调用时需要传递的参数,它们在函数调用和函数定义中的位置完全匹配。如果函数调用中未提供任何参数,或者参数的位置发生更改,则python解释器将显示错误。


请考虑以下示例。


例1

#the argument name is the required argument to the function func 
def func(name):
    message = "Hi "+name;
    return message;
name = input("Enter the name?")
print(func(name))


输出:


Enter the name?John
Hi John



例2

#the function simple_interest accepts three arguments and returns the simple interest accordingly
def simple_interest(p,t,r):
    return (p*t*r)/100
p = float(input("Enter the principle amount? "))
r = float(input("Enter the rate of interest? "))
t = float(input("Enter the time in years? "))
print("Simple Interest: ",simple_interest(p,r,t))


输出:


Enter the principle amount? 10000
Enter the rate of interest? 5
Enter the time in years? 2
Simple Interest:  1000.0



例3

#the function calculate returns the sum of two arguments a and b
def calculate(a,b):
    return a+b
calculate(10) # this causes an error as we are missing a required arguments b.


输出:

TypeError: calculate() missing 1 required positional argument: 'b'


关键字参数

Python允许我们使用关键字参数调用该函数。这种函数调用将使我们能够以随机顺序传递参数。


参数的名称被视为关键字,并在函数调用和定义中进行匹配。如果找到相同的匹配项,则会在函数定义中复制参数的值。


请考虑以下示例。


例1

#function func is called with the name and message as the keyword arguments
def func(name,message):
    print("printing the message with",name,"and ",message)
func(name = "John",message="hello") #name and message is copied with the values John and hello respectively


输出:

printing the message with John and  hello


示例2在调用时以不同顺序提供值

#The function simple_interest(p, t, r) is called with the keyword arguments the order of arguments doesn't matter in this case
def simple_interest(p,t,r):
    return (p*t*r)/100
print("Simple Interest: ",simple_interest(t=10,r=10,p=1900))


输出:

Simple Interest:  1900.0


如果我们在函数调用时提供不同的参数名称,则会引发错误。


请考虑以下示例。


例3

#The function simple_interest(p, t, r) is called with the keyword arguments. 
def simple_interest(p,t,r):
    return (p*t*r)/100
print("Simple Interest: ",simple_interest(time=10,rate=10,principle=1900)) # doesn?t find the exact match of the name of the arguments (keywords)


输出:

TypeError: simple_interest() got an unexpected keyword argument 'time'



python允许我们在函数调用时提供所需参数和关键字参数的混合。但是,必须在关键字参数之后给出必需的参数,即,一旦在函数调用中遇到关键字参数,以下参数也必须是关键字参数。


请考虑以下示例。


例4

def func(name1,message,name2):
    print("printing the message with",name1,",",message,",and",name2)
func("John",message="hello",name2="David") #the first argument is not the keyword argument

输出:

printing the message with John , hello ,and David


以下示例将导致错误,因为在函数调用中传递了关键字和必需参数的不正确混合。


例5

def func(name1,message,name2):
    print("printing the message with",name1,",",message,",and",name2)
func("John",message="hello","David")


输出:

SyntaxError: positional argument follows keyword argument


默认参数

Python允许我们在函数定义中初始化参数。如果在函数调用时未提供任何参数的值,则可以使用定义中给定的值初始化该参数,即使函数调用中未指定参数也是如此。


例1

def printme(name,age=22):
    print("My name is",name,"and age is",age)
printme(name = "john") #the variable age is not passed into the function however the default value of age is considered in the function


输出:

My name is john and age is 22



例2

def printme(name,age=22):
    print("My name is",name,"and age is",age)
printme(name = "john") #the variable age is not passed into the function however the default value of age is considered in the function
printme(age = 10,name="David") #the value of age is overwritten here, 10 will be printed as age

输出:


My name is john and age is 22
My name is David and age is 10


可变长度参数

在大型项目中,有时我们可能不知道要提前通过的参数的数量。在这种情况下,Python为我们提供了灵活性,可以提供逗号分隔值,这些值在函数调用时被内部视为元组。


但是,在函数定义中,我们必须使用*(star)将变量定义为* <variable - name>。


请考虑以下示例。


def printme(*names):
    print("type of passed argument is ",type(names))
    print("printing the passed arguments...")
    for name in names:
        print(name)
printme("john","David","smith","nick")


输出:


type of passed argument is  
printing the passed arguments...
john
David
smith
nick


变量范围

变量的范围取决于声明变量的位置。在程序的一个部分中声明的变量可能无法被其他部分访问。


在python中,变量是使用两种类型的范围定义的。


全局变量

局部变量

已知在任何函数外部定义的变量具有全局范围,而已知在函数内定义的变量具有局部范围。


请考虑以下示例。


例1

def print_message():
    message = "hello !! I am going to print a message." # the variable message is local to the function itself
    print(message)
print_message()
print(message) # this will cause an error since a local variable cannot be accessible here.

输出:


hello !! I am going to print a message.
  File "/root/PycharmProjects/PythonTest/Test1.py", line 5, in 
    print(message)
NameError: name 'message' is not defined

例2

def calculate(*args):
    sum=0
    for arg in args:
        sum = sum +arg
    print("The sum is",sum)
sum=0
calculate(10,20,30) #60 will be printed as the sum
print("Value of sum outside the function:",sum) # 0 will be printed

输出:


The sum is 60
Value of sum outside the function: 0