本篇博客将系统的介绍Python函数,一个函数可以定义一项特定的任务,如果需要在程序中多次执行同一项任务,无需反复编写完成该任务的代码,只需调用执行该任务的函数即可。

目录

1.定义函数

2.传递实参

3.返回值

4.传递列表

5.传递任意数量的实参

6.将函数存储到模块中


1.定义函数

  • 简单函数
def greet_user():print("hello!")greet_user()

函数用关键字def定义,其中greet_user是函数名,其后的()必不可少(即使是空的),定义以:结尾。

:后的缩紧为函数体,描述函数要做什么。

调用函数直接输入greet_user().

  • 向函数传递信息

在函数的()中可以设置参数,参数提供该函数需要的信息。

def greet_user(user_name):print("hello!"+user_name.title())greet_user('alice')
greet_user('bob')

  • 实参和形参

函数括号中定义的参数,如之前的user_name称为形参;而调用函数时在括号中传入的参数为实参,如'alice'和'bob'。

在greet_user('alice')中将实参'alice'传递给函数greet_user(),这个值被存储在形参user_name中。

2.传递实参

函数定义中可以有多个形参,因此在调用时也可能传入多个实参。有以下几种向函数传递实参的方式:

  • 位置实参

要求实参的顺序和形参必须相同,调用时一个实参关联一个形参,相应位置一一对应。

def describe_pet(animal_type,pet_name):print("I have a "+animal_type+".")print("Its name is "+pet_name+".")describe_pet('dog','pp')
describe_pet('cat','mimi')

使用位置实参时,需要记住形参的顺序,顺序很重要,如果传入实参的顺序不对,可能会产生出人意料的结果或报错:

describe_pet('mini','cat')

此时和我们希望的正好相反。

  • 关键字实参

关键字实参传入的是名-值对,传递实参时将形参名称和实参值进行关联。此时可以不用考虑实参的顺序问题,不需要记住形参的顺序,只需要知道有哪些形参就好了。推荐使用,可以减少不必要的麻烦/失误:

def describe_pet(animal_type,pet_name):print("I have a "+animal_type+".")print("Its name is "+pet_name+".")describe_pet(animal_type='dog',pet_name='wangwang')
describe_pet(pet_name='wangwang',animal_type='dog')

  • 默认值

编写函数时,可以为形参设置默认值。调用时如果为该形参传入了值,则使用传入的值,如果没有传,该形参就使用默认值。

对于没有设置默认值的形参,调用时必须传入实参(采用位置实参或关键字实参)。

定义函数时,注意有默认值的形参要在位置形参(没有默认值的形参)后面。

def describe_pet(pet_name,animal_type='dog'):print("I have a "+animal_type+".")print("Its name is "+pet_name+".")describe_pet('wangwang')
describe_pet(pet_name='wangwang')
describe_pet(pet_name='mini',animal_type='cat')

  • 等效的函数调用

在调用函数时可以使用位置实参、关键字实参或使用默认值,而且这些方式还可以混用,所以会有多种等价的函数调用方式,如下所示,都是i可以的:

def describe_pet(pet_name,animal_type='dog'):print("I have a "+animal_type+".")print("Its name is "+pet_name+".")
#一只名为 wangwang的小狗
describe_pet('wangwang')
describe_pet(pet_name='wangwang')
print("-------------------------------")
#一只名为mini的小猫
describe_pet('mini','cat')
#describe_pet(pet_name='mimi','cat') #位置实参必须在关键字实参前  否则报错
describe_pet('mini',animal_type='cat')
describe_pet(pet_name='mini',animal_type='cat')
describe_pet(animal_type='cat',pet_name='mini')

当函数形参比较多时,这种组合方式会越来越多。

注意当位置实参和关键字实参混合使用时,位置实参必须在关键字实参前面。

推荐统一使用关键字实参。

避免实参错误,传入的实参多于或少于函数定义的形参(默认形参除外)就会出现实参不匹配的错误。

3.返回值

Python函数可以返回一个值或一组值。

  • 返回简单值
def get_format_name(first_name,last_name):full_name = first_name+' '+last_namereturn full_name.title()fn = get_format_name(first_name='james',last_name='lebron')
print(fn)

  • 让实参变为可选
def get_format_name(first_name,last_name,middle_name=''): #给middle_name设置默认值 放在最后if middle_name:full_name = first_name+' '+middle_name+' '+last_nameelse:full_name = first_name+' '+last_namereturn full_name.title()print(get_format_name(first_name='james',middle_name='a',last_name='leborn')) #使用关键字实参 不用关心顺序
print(get_format_name(first_name='james',last_name='leborn')) #可以不用传 使用默认值

  • 返回字典

函数可以返回任意类型,包括列表、字典、元组等数据结构。

def build_person(first_name,last_name,age=''):if age:person = {'first':first_name,'last':last_name,'age':age}else:person = {'first':first_name,'last':last_name}return personprint(build_person(first_name='james',last_name='le',age=27))
print(build_person(first_name='james',last_name='le'))

返回元组:

def A(a,b,c):term1 = a+b+cterm2 = a*b*creturn term1,term2     #返回元组 省略了()print(A(a=1,b=2,c=3))
print(A(a=2,b=2,c=2)[1]) #可以只取返回值中的某个值

  • 结合使用函数和while循环
def get_format_name(first_name,last_name):full_name = first_name+' '+last_namereturn full_name.title()while True:print("\nPlease tell me your name:")print("enter 'q' to exit.")f_name = input('first_name: ')if f_name == 'q':breakl_name = input('last_name: ')if l_name == 'q':breakprint(get_format_name(first_name=f_name,last_name=l_name))

4.传递列表

有时候像函数传递列表会很有用,列表可能包含字符串、数字或更复杂的对象(列表,字典等)。

向函数传递列表,函数能直接访问他的内容。

def greet_users(names):for name in names:msg = 'hello,'+name.title()print(msg)user_names = ['alice','bob','dog']
greet_users(user_names)
  • 在函数中修改列表

将列表传入函数,函数就可以对他进行修改,这种修改是永久性的。

def ZhuanYi(list1,list2):#将list1中的元素转移到list2while list1:a = list1.pop()print('current '+a)list2.append(a)l1 = ['alice','bob','dog']
l2 = []
print(l1)
print(l2)
ZhuanYi(list1=l1,list2=l2)
print("--------------------")
#l1,l2传入函数后 发生了变化 这种变化是永久的
print(l1)
print(l2)

如果传递列表,对形参进行修改,实参相应也被修改了。

如果传递数值变量,对形参修改,实参不会改变:

a = 5
def A(b):b += 1
A(a)
print(a)

  • 禁止函数修改列表

可以把列表的副本(列表的值)传给函数,此时形参被修改了,实参不会修改:

def ZhuanYi(list1,list2):#将list1中的元素转移到list2while list1:a = list1.pop()print('current '+a)list2.append(a)l1 = ['alice','bob','dog']
l2 = []
print(l1)
ZhuanYi(list1=l1[:],list2=l2)
print("--------------------")
#l1副本传入函数后 l1本身不会改变
print(l1)

5.传递任意数量的实参

为函数设置一个形参 ,前面加一个'*',此时不管调用语句提供了多少个实参,这个形参都能将它收入囊中:

def make_pizza(*toppings):print(toppings)print('make pizza with the following thing:')for toping in toppings:print('- '+toping)make_pizza('mush','a','b')
print("---------------")
make_pizza('a')

  • 结合使用位置实参和任意数量实参
def make_pizza(size,*toppings):print(toppings)print('make a '+str(size)+' inch pizza with the following thing:')for toping in toppings:print('- '+toping)make_pizza(12,'mush','a','b')
print("---------------")
make_pizza(16,'a')

  • 使用任意数量的关键字实参

使用任意数量的关键字实参,函数在调用时可以接受任意数量的键值对。在形参前加符号'**'

def build_profile(first_name,last_name,**user_info):person = {}person['f_name'] = first_nameperson['l_name'] = last_namefor key,value in user_info.items():person[key] = valuereturn personprint(build_profile('james','le',location='taian',age=27,filed='math'))

6.将函数存储到模块中

可以把写好的函数放在一个.py文件(模块)中,可以在同目录下的其他.py文件中导入。

当然也可以不在同一目录下,此时前面加上相对/绝对路径即可。

引用Python内建的模块,操作也是一样的。

现有apple.py,其中的内容如下:

def add(a,b):return a+bdef mul(a,b):return a*bdef minus(a,b):return a-b

现在在同一路径下的其他.py文件中对他进行引用:

  • 导入整个模块
import appleprint(apple.add(1,2))  #使用apple.的形式调用 模块内的函数
print(apple.minus(3,4))
  • 导入特定的函数

形式:

from module_name import function_name
from module_name import function_name1.function_name2 #可以有多个 ,隔开
from apple import add,minusprint(add(1,2))  #可以直接使用函数名调用
print(minus(3,4))
  • 使用as 给函数更名
from module_name import function_name as fn
from apple import add as A
from apple import mul as Mprint(A(1,2))  #可以直接使用更名调用
print(M(2,2))
  • 使用as给模块更名
import module_name as mn
import apple as aprint(a.add(1,2))  #使用a.的形式调用 模块内的函数
print(a.minus(3,4))
  • 导入模块中的所有函数
from module_name import *
from apple import *print(add(1,2))  #可以直接使用函数名调用
print(mul(2,2))
print(minus(1,4))

Python基础 | (7)Python中的函数相关推荐

  1. python基础---元组、字典、函数、文件、异常

    文章目录 python基础---元组.字典.函数.文件.异常 Tuple(元组) 常用操作 dict(字典) 函数 文件 异常 python基础-元组.字典.函数.文件.异常 Tuple(元组) tu ...

  2. python调用js库中的函数_Python 调用JS文件中的函数

    Python 调用JS文件中的函数 1.安装PyExecJS第三方库 2.导入库:import execjs 3.调用JS文件中的方法 Passwd = execjs.compile(open(r&q ...

  3. Python基础学习-Python中最常见括号()、[]、{}的区别 2015-08-13 07:54 by xuxiaoxiaoxiaolu, 1138 阅读, 0 评论, 收藏, 编辑 Pytho

    Python基础学习-Python中最常见括号().[].{}的区别 2015-08-13 07:54 by xuxiaoxiaoxiaolu, 1138 阅读, 0 评论, 收藏, 编辑 Pytho ...

  4. Python如何在main中调用函数内的函数

    Python如何在main中调用函数内的函数 一般在Python中在函数中定义的函数是不能直接调用的,但是如果要用的话怎么办呢? 一般情况下: def a():#第一层函数def b():#第二层函数 ...

  5. python基础类型,Python基础-类

    Python基础-类 @(Python)[python, python基础] 写在前面 如非特别说明,下文均基于Python3 摘要 本文重点讲述如何创建和使用Python类,绑定方法与非绑定方法的区 ...

  6. 视频教程-扣丁学堂Python基础视频教程-Python

    扣丁学堂Python基础视频教程 十余年计算机技术领域从业经验,在中国电信.盛大游戏等多家五百强企业任职技术开发指导顾问,国内IT技术发展奠基人之一. 杨千锋 ¥99.00 立即订阅 扫码下载「CSD ...

  7. python基础语法--python语言及其应用

    python基础语法 python引言 python python语言是一种高级动态.完全面向对象的语言. python中函数.模块.数字.字符串都是对象. python完全支持继承.重载.派生.多继 ...

  8. 二十一. Python基础(21)--Python基础(21)

    二十一. Python基础(21)--Python基础(21) 1 ● 类的命名空间 #对于类的静态属性:     #类.属性: 调用的就是类中的属性     #对象.属性: 先从自己的内存空间里找名 ...

  9. Python基础了解 python自带IDLE编译

    目录 学习小标 学习产出: 前言 一.Python版本 二.语言运用的占比 2021年 6 月编程语言排行榜前 20名 三.Python的应用 1.Web开发 2.网络爬虫 3.大数据处理 4.人工智 ...

  10. 我的全栈之路-Python基础之Python概述与开发环境搭建

    我的全栈之路-Python基础之Python概述与开发环境搭建 我的全栈之路 1.1 信息技术发展趋势 1.2 浅谈计算机系统架构 1.2.1 计算机系统架构概述 1.2.2 计算机硬件系统 1.2. ...

最新文章

  1. 粒子追踪 matlab,用粒子滤波器实现的多目标跟踪代码
  2. 解析1G到5G技术与设备发展历程
  3. PHP设置二维码中间为logo
  4. 《mongodb权威指南》学习
  5. 【排序算法】计数排序引发的围观风波——一种O(n)的排序
  6. powerBi odbc 连接impala 实现自助分析
  7. Hlg 1750 【树的最长路径】.cpp
  8. Entity Framework Core 之数据库迁移
  9. Codeforces.666E.Forensic Examination(广义后缀自动机 线段树合并)
  10. 这轮AI才刚刚启动,就开始有人谈AI泡沫了?
  11. 7 SDImageCache
  12. 2012年8月编程语言排行榜
  13. 云原生|kubernetes|centos下安装部署kubeapps以及简单的使用示例
  14. 一键批量替换文本工具
  15. 【英语学习】【WOTD】arduous 释义/词源/示例
  16. 变频泵 计算机控制技术,变频泵站节约能耗的计算机控制技术浅析
  17. 常用网址-2023整理
  18. beyond comparet提示30天过期-解决办法(亲测,可用)
  19. Ciclop开源3D扫描仪软件---Horus源码分析之Image_capture.py
  20. 理解WebKit和Chromium: WebKit和Blink

热门文章

  1. Git--将本地代码提交到服务器分支上
  2. 魅蓝这也叫向5c致敬?
  3. 【Redis】NoSQL简介
  4. 目标检测:XML文件矩形框在图片上的简单可视化
  5. 华为云ModelArts的简单使用
  6. 水浒传水果拉霸类游戏物体旋转思路
  7. 智慧电厂信息系统设计方案(上)
  8. 学习英文-学以致用【场景:good for me or good to me】
  9. 知识管理,浏览器收藏夹,经常访问的网站
  10. pdf转word文档方法