python 函数

定义

函数是指将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需调用其函数名即可。

特性

  1. 减少代码重复
  2. 使程序变得可扩展
  3. 使程序变得易于维护

函数的创建

python中创建函数,需要使用__def__关键字,后面写函数的名字,然后是形参列表,大体如下:

def 函数名(形参列表):
函数体......
return 返回值

其中形参列表和 return返回值并不是必须的。

函数的使用

想要调用函数程序,需要以函数名加括号的形式进行调用,而括号内可以传入参数,而括号内的参数我们称之为__实参列表__,传入的实参会通过形参传递进函数,在函数内部就可以使用了。如下:

def add(x,y):
return x + y # 调用函数
add(10,20)

需要注意的是,python中的实参列表每一个参数之前用逗号分割,而向add()括号内的10,20这样的参数我们称之为位置参数(positional argument)。

那么需要注意的是,在python中,函数的实参的个数必须和形参的个数一样,实参个数多于形参或者少于形参都会报错。

函数的参数

形参也可以叫做形参变量,只有在被调用时才分配内存单元,在调用结束时,即释放所分配的内存单元。所以形参只能在函数内部生效。函数调用结束返回主调用函数后则不能够再使用该形参变量。

实参可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参。因此应预先用赋值,输入等办法使参数获得确定值

默认参数

首先,先来看下面的代码:

def stu_register(name,age,country,course):
print('------注册学生信息--------')
print('学员姓名:',name)
print('学员年龄:',age)
print('学员国籍:',country)
print('学员选择课程:',course) stu_register('小明',19,'中国','web前端')
stu_register('小红',20,'中国','linux')
stu_register('李白',25,'中国','python')

在上面的实例中,每一个学员注册的国籍都是中国,而在网上的一些网站中,如果不去手动设置,都默认为中国,这就是通过默认参数实现的。

如下,把country变成默认参数,

def stu_register(name,age,course,country='中国')

那么此时再注册学员的时候如果国籍是中国就可以不需要进行国籍的传参,而是采用默认的参数。

关键参数

正常情况下,给函数传参数要按顺序,不想按顺序就可以用关键参数,只需指定参数名即可,但记住一个要求就是,关键参数必须放在位置参数之后。

# 使用关键字参数
stu_register(name='小明',country='中国',age=19,course='linux')
'''关键字参数必须放在位置参数之后'''
stu_register('小红',country='中国',age=19,course='linux')

非固定参数

如果你的函数中并不是很确定用户会传入多少个参数,那么就可以使用非固定参数。

'''非固定参数'''
def test01(x,y,*args):
print(x,y)
print(args) test01('李白','艳艳',12,3,4)

输出结果为:

李白 艳艳
(12, 3, 4)

需要注意的是,当使用了*args的时候,会发现传入的参数全部被放在了一个元组中。那么如果想要操作的话只需按照元组的操作方式操作即可。

非固定参数除了可以转换成元组以外,还可以将传入的数据转换成字典,需要使用**kwargs,代码如下:

def stu_register(name,age,*args,**kwargs): # *kwargs 会把多传入的参数变成一个dict形式
print(name,age,args,kwargs) stu_register("Alex",22)
#输出
#Alex 22 () {}#后面这个{}就是kwargs,只是因为没传值,所以为空 stu_register("Jack",32,"CN","Python",sex="Male",province="ShanDong")
#输出
# Jack 32 ('CN', 'Python') {'province': 'ShanDong', 'sex': 'Male'}

局部变量和全局变量

在python中,函数外部声明的变量我们称之为全局变量,在函数内部声明的变量是局部变量。

全局变量可以在变量声明之后的任何位置使用,而局部变量只能够在函数内部使用。

'''全局变量和局部变量'''
name = '李白' # 函数外部声明 ,称之为全局变量 def test():
age = 20 # 函数内部声明,称之为局部变量
print(age) # 局部变量只能够在函数内部使用
print(name) # 全局变量可以在函数内部使用
test()
# print(age) 在函数外部没有办法使用局部变量

__tip:函数内部声明全局变量__

如果想要在函数内部声明全局变量,需要使用global关键字

def test():
global test
test = '李白斗酒诗百篇'
test()
print(test) # 李白斗酒诗百篇

通过global关键字就能够在函数内部创建全局变量,但是这种写法是不推荐使用的,有可能造成变量污染。

还有一点需要注意,看下面的代码:

name = '艳艳'

def test():
# 在函数中更改全局变量name的值
name = 'hello,world'
print(name) # hello,world
test()
print(name) # 艳艳

上述代码中,在函数中对全局变量进行了更改,并且打印更改之后的变量,那么打印的结果是更改的结果,但是在函数的外面再次打印在函数中更改的全局变量,发现结果并没有被更改,因为在函数中更改全局变量,那么更改过后的值作用域仅停留在函数当中。

那么如何在函数中对全局变量更改并且在函数外部调用结果为更改之后的值呢?同样可以使用global关键字来实现。

name = '艳艳'

def test():
global name
# 在函数中更改全局变量name的值
name = 'hello,world'
print(name) # hello,world
test()
print(name) # hello,world

返回值

要想获取函数的执行结果,就可以用return语句把结果返回

注意:

函数在执行过程中只要遇到return语句,就会停止执行并返回结果,so 也可以理解为 return 语句代表着函数的结束
如果未在函数中指定return,那这个函数的返回值为None 。

递归函数

在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数。

'''创建一个递归,将传入的参数不断的除以2,到0为止'''
def calc(n):
print(n)
if int(n/2) > 0 :
return calc( int(n/2) ) calc(10)

输出结果为:

10
5
2
1

递归特性:

  1. 必须有一个明确的结束条件

  2. 每次进入更深一层递归时,问题规模相比上次递归都应有所减少

  3. 递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出)

堆栈扫盲http://www.cnblogs.com/lln7777/archive/2012/03/14/2396164.html

简单介绍下python中函数的基础语法的更多相关文章

  1. python 中函数参数传递形式

    python中函数参数的传递是通过赋值来传递的.函数参数的使用又有俩个方面值得注意:1.函数参数是如何定义的 2.在调用函数的过程中参数是如何被解析 先看第一个问题,在python中函数参数的定义主要 ...

  2. 深入理解python中函数传递参数是值传递还是引用传递

    深入理解python中函数传递参数是值传递还是引用传递 目前网络上大部分博客的结论都是这样的: Python不允许程序员选择采用传值还是传 引用.Python参数传递采用的肯定是"传对象引用 ...

  3. python中pandas数据分析基础3(数据索引、数据分组与分组运算、数据离散化、数据合并)

    //2019.07.19/20 python中pandas数据分析基础(数据重塑与轴向转化.数据分组与分组运算.离散化处理.多数据文件合并操作) 3.1 数据重塑与轴向转换1.层次化索引使得一个轴上拥 ...

  4. 简单探讨python中的语句和语法

    python程序结构 python"一切皆对象",这是接触python听到最多的总结了.在python中最基层的单位应该就是对象了,对象需要靠表达式建立处理,而表达式往往存在于语句 ...

  5. (转)python中函数参数中如果带有默认参数list的特殊情况

    在python中函数参数中如果带有默认参数list遇到问题 先看一段代码 1 2 3 4 5 6 7 8 9 def f(x,l=[]):     for i in range(x):         ...

  6. 学以致用三十二-----python中函数的括号使用

    一直以来对python中函数括号的使用,有点分不清楚,到底什么时候用括号,什么时候不用括号,造成了很大看困惑. 今天来总结下. class aaa(): y = 'you' def __init__( ...

  7. python中函数的参数

    函数参数(一) 思考一个问题,如下: 现在需要定义一个函数,这个函数能够完成2个数的加法运算,并且把结果打印出来,该怎样设计?下面的代码可以吗?有什么缺陷吗? def add2num(): a = 1 ...

  8. python中函数参数传递的几种方法

    转自  http://www.douban.com/note/13413855/ Python中函数参数的传递是通过“赋值”来传递的.但这条规则只回答了函数参数传递的“战略问题”,并没有回答“战术问题 ...

  9. Python中函数参数传递问题【转】

    1. Python passes everything the same way, but calling it "by value" or "by reference& ...

随机推荐

  1. 【leetcode 简单】 第一百一十题 分发饼干

    假设你是一位很棒的家长,想要给你的孩子们一些小饼干.但是,每个孩子最多只能给一块饼干.对每个孩子 i ,都有一个胃口值 gi ,这是能让孩子们满足胃口的饼干的最小尺寸:并且每块饼干 j ,都有一个尺寸 ...

  2. PHP编程效率的20个要点-[转]

    用 单引号代替双引号来包含字符串,这样做会更快一些.因为PHP会在双引号包围的字符串中搜寻变量,单引号则 不会,注意:只有echo能这么做,它是一种可以把多个字符 串当作参数的“函数”(译注:PHP手 ...

  3. spring-boot-单元测试参数数

    简单案例 @RunWith(Parameterized.class) public class ParameterTest { // 2.声明变量存放预期值和测试数据 private String f ...

  4. aarch64_fc26_url

    http://linux.yz.yamagata-u.ac.jp/pub/linux/fedora-projects/fedora-secondary/releases/26/Everything/a ...

  5. gitHub 迁移到gitlab上

    GitHub 迁移到 GitLab 上 第一步在github上生成 token 地址 https://blog.csdn.net/u014175572/article/details/55510825 ...

  6. ASP .NET Core 2.0 MVC 发布到 IIS 上以后 无法下载apk等格式的文件

    ASP .NET Core MVC 发布到  IIS 上以后 无法下载apk等格式的文件 使用.NET Core MVC创建了一个站点,其他文件可以下载,但是后来又需求,就把手机端的apk合适的文件上 ...

  7. IntelliJ IDEA 自动导入包的问题

    我们再使用IDE写代码的时候,往往需要 鼠标点中这个类 然后 使用 alt+enter ,导入响应的包,如果导入的包比较多,一个一个点 也是费事.  因为用手动,有可能需要你选择导入那个包,有时候类名 ...

  8. hihoCoder #1183 : 连通性一·割边与割点(求割边与各点模板)

    #1183 : 连通性一·割边与割点 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 还记得上次小Hi和小Ho学校被黑客攻击的事情么,那一次攻击最后造成了学校网络数据的丢 ...

  9. Java多线程-Java多线程概述

    第一章 Java多线程概述 线程的启动 线程的暂停 线程的优先级 线程安全相关问题 1.1 进程与线程 进程:可以将运行在内存中的程序(如exe文件)理解为进程,进程是受操作系统管理的基本的运行单元. ...

  10. 利用Requests库写爬虫

    基本Get请求: #-*- coding:utf-8 -*- import requests url = 'http://www.baidu.com' r = requests.get(url) pr ...