• 函数

函数是带名字的代码块,用于完成具体的工作。
通过使用的函数,程序的编写、阅读、测试和修复都将更容易。
本节内容包括函数的定义、向函数传递参数、函数的返回值和模块的导入。

- 函数的定义

##---def function
def greet_user():print("Hello!")
##---use function
greet_user()

函数的定义使用关键字def,函数名后面的括号和冒号都是必须的。
使用的时候直接调用就OK了,和C++一样。

- 向函数传递参数

向函数传递参数涉及到形参和实参的概念,简单的理解在函数定义中的输入变量是形参,而在函数调用过程中的输入变量是实参,实参可以传递给形参,反之不可以。
Python向函数传递实参分两种方式:位置实参和关键字实参。
位置实参:要求实参顺序和形参顺序保持一致【通过位置来区别各个参数】
关键字实参:每个实参都由变量名和值组成【通过关键字区别各个参数】

位置实参的例子:

def describe_pet(animal_type,pet_name):print("\nI have a "+animal_type+".")print("My "+animal_type+"'s name is "+pet_name+".")describe_pet("hamster",'Harry')
describe_pet("dog",'Lele')


关键字实参的例子:

def describe_pet(animal_type,pet_name):print("\nI have a "+animal_type+".")print("My "+animal_type+"'s name is "+pet_name+".")describe_pet(animal_type="hamster",pet_name='Harry')
describe_pet(pet_name='Harry',animal_type="hamster")


位置实参的顺序很重要,而关键字实参的顺序却无关紧要。

默认值

编写函数时,可以给每个形参指定默认值。
给形参指定默认值后,可在函数调用中省略相应的实参。

def describe_pet(animal_type,pet_name='harry'):print("\nI have a "+animal_type+".")print("My "+animal_type+"'s name is "+pet_name+".")
describe_pet("hamster")
describe_pet(pet_name='Peter',animal_type="hamster")

这里需要注意的点是如果采用位置实参的方法,指定默认值的形参需要放在后面。

可以混合使用位置实参、关键词实参和默认值,因此有多种等效的函数调用方式。

传递任意数量的实参
有时候,预先不知道函数需要接受多少个实参,python允许函数从调用语句中收集任意数量的实参。

def make_pizza(*toppings):print(toppings)
make_pizza('pepperoni')
make_pizza('mushrooms','greens peppers','extra cheese')


形参名*toppings中的星号让python创建一个名为toppings的空元组,并将收到的所有值都封装到这个元组中。【总觉得这是个指针,这里不明白机理】

结合使用位置实参和任意数量实参
如果要让函数接受不同类型的实参,必须在函数定义中将接纳任意数量实参的形参放在最后。Python会先匹配位置实参和关键字实参,然后将余下的实参收集到最后一个形参中。

def make_pizza(size,*toppings):print("\nMaking a "+str(size)+"-inch pizza with following toppings:")for topping in toppings:print("-"+topping)
make_pizza(16,'pepperoni')
make_pizza(12,'mushrooms','greens peppers','extra cheese')


使用任意数量的关键字实参
有时候需要接受任意数量的实参,但是预先不知道传递给函数的会是什么样的信息。在这种情况下,可将函数编写成能够接受任意数量的键值对。

def build_profile(first,last,**user_info):profile={}profile['first_name']=firstprofile['last_name']=lastfor key,value in user_info.items():profile[key]=valuereturn profileuser_profile=build_profile('albert','einstein',location='princton',field='physics')
print(user_profile)

形参**user_info的两个星号让python创建一个名为user_info的空字典,并将收到的所有键值对都封装到这个字典中。

向函数传递列表
向函数传递列表是很有用的。

def greet_users(names):for name in names:msg="Hello,"+name.title()+"!"print(msg)
usernames=['haang','ty','margot']
greet_users(usernames)


在函数中修改列表

def print_models(unprinted_designs,completed_models):while unprinted_designs:current_design=unprinted_designs.pop()print("Printing model: "+current_design)completed_models.append(current_design)
def show_completed_models(completed_models):print("\nThe following models have been printed: ")for completed_model in completed_models:print(completed_model)unprinted_designs=['iphone case','robot','doedsad']
completed_models=[]print_models(unprinted_designs,completed_models)
show_completed_models(completed_models)

编写了两个函数,每个负责一件具体的工作。
第一个函数将负责处理打印设计的工作,另一个将概述打印了哪些设计。

禁止函数修改列表
禁止函数修改列表,只需要将列表的副本传递给函数。
切片法[:]表示创建列表的副本。

def print_models(unprinted_designs,completed_models):while unprinted_designs:current_design=unprinted_designs.pop()print("Printing model: "+current_design)completed_models.append(current_design)
def show_completed_models(completed_models):print("\nThe following models have been printed: ")for completed_model in completed_models:print(completed_model)unprinted_designs=['iphone case','robot','doedsad']
completed_models=[]
print(unprinted_designs)
print_models(unprinted_designs[:],completed_models)
print(unprinted_designs)
print_models(unprinted_designs,completed_models)
print(unprinted_designs)


向函数传递列表的副本可以保留原始内容,但除非有充分的的理由这么做,否则还是应该把原始列表传递给函数,因为让函数使用现成列表可以避免花费时间和内存创建副本而提高效率,尤其在处理大型列表时。

- 函数的返回值

函数处理数据后往往需要返回数据,return可以将值返回到调用函数的代码行。

def get_formatted_name(first_name,last_name):full_name=first_name+" "+last_namereturn full_namemusician=get_formatted_name('jim','henrix')
print(musician)

调用返回值时需要提供一个变量用来存储返回的值。
函数可以返回任何类型的值,包括列表和字典等较复杂的数据结构。
返回字典的例子

def build_person(first_name,last_name):person={'first':first_name,'last':last_name}return personmusician=build_person('jim','henrix')
print(musician)

模块的导入

函数的优点之一是可以将代码块和主程序分离,通过给函数指定描述性名称可以让主程序容易理解得多。更进一步地可以将函数存储在被称为模块 的独立文件中,再将模块导入到主程序中。
导入整个模块
模块时扩展名为.py的文件,包含需要导入到程序中的代码。
模块的名称和函数名称之间没有强制的关系,一个模块中可以包含多个函数。
创建模块pizza.py

def make_pizza(size, *toppings):"""Summarize the pizza we are about to make."""print("\nMaking a " + str(size) +"-inch pizza with the following toppings:")for topping in toppings:print("- " + topping)

在另一个文件中导入该模块

import pizza #import module_name
pizza.make_pizza(16,'pepperoni')#module_name.function_name()
pizza.make_pizza(12,'mushrooms','greens peppers','extra cheese')import pizza as p #another name
p.make_pizza(16,'pepperoni')#module_name.function_name()
p.make_pizza(12,'mushrooms','greens peppers','extra cheese')#import all function
from pizza import *
make_pizza(16,'pepperoni')#function_name()
make_pizza(12,'mushrooms','greens peppers','extra cheese')

这是导入模块中所有函数的方法,其中第二种指定别名的方式比较常见,而第三种容易和本文件中的函数重名,不太建议使用。

导入特定函数的方法

### import function from module
from pizza import make_pizza
make_pizza(16,'pepperoni')#function_name()
make_pizza(12,'mushrooms','greens peppers','extra cheese')### import function from module
from pizza import make_pizza as mp #another name
mp(16,'pepperoni')#function_name()
mp(12,'mushrooms','greens peppers','extra cheese')

使用as给函数或模块指定别名,指定简洁的别名既可以避免重名,又比较简洁。

在编写函数时,应给函数指定描述性名称,应包含简要阐述其功能的注释。
此外在给形参指定默认值时,等号两边不要有空格。

6.Python之函数相关推荐

  1. 【Python】函数图像绘制:二维图像、三维图像、散点图、心形图

    [Python]函数图像绘制:二维图像.三维图像.散点图.心形图 所有需要用的包 二维图像 三维图像 散点图绘制 心形图绘制 所有需要用的包 from mpl_toolkits.mplot3d imp ...

  2. 技术图文:Python 匿名函数 VS. C# Lambda表达式

    背景 前段时间在知识星球上立了一个Flag,至少写10篇关于 Python,Matlab 和 C# 对比的总结. 这是第 2 篇,从定义和应用两个角度来对比 Python 的匿名函数 与 C# 的La ...

  3. Python divmod() 函数

    Python divmod() 函数 python divmod() 函数把除数和余数运算结果结合起来,返回一个包含商和余数的元组(a // b, a % b). 函数语法 divmod(a, b) ...

  4. python参数传递方法_深入理解python中函数传递参数是值传递还是引用传递

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

  5. python中函数包括标准库函数吗_Python语言和标准库(第二章:函数)

    a-如何创建函数. b-给出一些指导原则,帮助思考如何创建和组织程序以使用函数. c-如何编写函数,使随后可以询问它们的工作方式和实现的功能. 2.1将程序放在单独的文件里 为了更加方便,从现在开始, ...

  6. c int转字符串_【C++实现python字符串函数库】字符串匹配函数startswith与endswith

    [C++实现python字符串函数库]字符串匹配函数startswith与endswith 这两个函数用于匹配字符串的开头或末尾,判断是否包含另一个字符串,它们返回bool值.startswith() ...

  7. python中函数和方法的区别?Python编程判断当前获取的对象是函数还是方法

    python中函数和方法的区别?Python编程判断当前获取的对象是函数还是方法 目录

  8. python log函数怎么打_Python的log日志功能及设置方法

    python log函数怎么打_Python的log日志功能及设置方法_Elaine要当律师的博客-CSDN博客

  9. Python staticmethod() 函数

    Python staticmethod() 函数 正在上传-重新上传取消​ Python 内置函数 python staticmethod 返回函数的静态方法. 该方法不强制要求传递参数,如下声明一个 ...

  10. python基础--函数

    #python中函数的定义:函数是逻辑结构化和过程化的一种编程方法,用来实现某些特定的功能.#python中函数简单定义的方法# def test(x):# "this is new fun ...

最新文章

  1. Python函数名的第一类对象及使用
  2. 单点登录Redis存储Session及SessionId问题说明与集群实战-2
  3. java 固定listview_listview Button始终放在底部示例
  4. jQuery 1.9+ 移除$.browser方法
  5. 分布式6大核心专题_分布式Session
  6. python 金字塔的程序_python生成金字塔
  7. 完成一个分析H264码流的工具
  8. wpf 点击某控件范围之外的区域 该控件隐藏_手机键盘交互细节:视觉效果与触发区域之间的交互逻辑...
  9. 涩会:大学学历——办理居住证的具体流程(深圳)
  10. php论坛首页一般是什么,bbs是什么
  11. 依然仰望星空,脚踏实地——个人CSDN年度总结。
  12. ChemDraw使用不了怎么办
  13. 跟着小马哥学系列之 Spring AOP(AbstractAutoProxyCreator 详解)
  14. 电脑HDMI接电视 设置耳机输出声音
  15. Spring Boot 框架学习笔记(五)( SpringSecurity安全框架 )
  16. vue+videojs视频播放、视频切换、视频断点分段上传
  17. Linux无法账号密码登录问题
  18. 简单航班查询系统java_基于jsp的航班信息查询-JavaEE实现航班信息查询 - java项目源码...
  19. 小程序上传视频的php接口处理,微信小程序[第十二篇] -- 上传视频
  20. 一种迪文屏软件在线升级方法

热门文章

  1. 基于html5鼠标悬停图片动画展示效果
  2. js导出科学计数法_怎么让js不自动转换成科学计数法
  3. MODE-CSR相关
  4. python蚂蚁森林自动偷能量_蚂蚁森林自动偷能量app
  5. 线性回归-多元线性回归
  6. 数据结构之中缀表达式转为后缀
  7. 今天碰到的几个老司机(r12笔记第63天)
  8. 人工智能很危险!?开发需谨慎?
  9. 小微贷款按小时算利息,会是互联网巨头“放贷梦“的终局吗?
  10. HyperLedger Cello学习笔记