python3入门笔记二之 函数 & 参数

简介: 函数定义 def :def my_abs(x): if x >=0: return x else: return -xprint(my_abs(-55))复制代码返回结果 return:如果没有return语句,函数执行完毕后也会返回结果,只是结果为None。return None可以简写为return 返回多个值其实就是返回一个tuple,只有一个tuple时可以省略括号 如 return 1,2,3

函数


定义 def :


def my_abs(x): 
    if x >=0:
        return x
    else:
        return -x
print(my_abs(-55))
复制代码


返回结果 return:


如果没有return语句,函数执行完毕后也会返回结果,只是结果为None。return None可以简写为return 返回多个值其实就是返回一个tuple,只有一个tuple时可以省略括号 如 return 1,2,3


导入方法: from 文件名 import 方法名


# 从 abstest.py  文件中导入 my_abs() 函数
from abstest import my_abs
my_abs(-9)
复制代码


空函数: pass占位符的使用


这里主要是pass语句的使用,pass可以用来作为占位符,比如现在还没想好怎么写函数的代码,就可以先放一个pass,让代码能运行起来。 如:


def nop():
    pass
print(nop())  # None
复制代码


递归函数: 注意栈溢出


def fact(n):
    if n==1:
        return 1
    return n * fact(n - 1)
复制代码


递归函数要注意防止栈溢出,可以通过尾递归优化,es6中已经有了,可以参考博主的这篇文章 《es6入门提升总结一》  中的这个尾递归优化。


尾递归是指,在函数返回的时候,调用自身本身,并且,return语句不能包含表达式。这样,编译器或者解释器就可以把尾递归做优化,使递归本身无论调用多少次,都只占用一个栈帧,不会出现栈溢出的情况。


def fact(n):
    return fact_iter(n, 1)
def fact_iter(num, product):
    if num == 1:
        return product
    return fact_iter(num - 1, num * product)
复制代码

尾递归调用时,如果做了优化,栈不会增长,因此,无论多少次调用也不会导致栈溢出。 遗憾的是,大多数编程语言没有针对尾递归做优化,Python解释器也没有做优化,所以,即使把上面的fact(n)函数改成尾递归方式,也会导致栈溢出。

使用递归函数的优点是逻辑简单清晰,缺点是过深的调用会导致栈溢出。 针对尾递归优化的语言可以通过尾递归防止栈溢出。尾递归事实上和循环是等价的,没有循环语句的编程语言只能通过尾递归实现循环。Python标准的解释器没有针对尾递归做优化,任何递归函数都存在栈溢出的问题。

参数

参数检查: isinstance ,raise TypeError


if not isinstance(x, (int, float)):
        raise TypeError('bad operand type')
复制代码


调用函数时,如果参数个数不对,Python解释器会自动检查出来,并抛出TypeError,但是如果参数类型不对,Python解释器就无法帮我们检查


参数个数不对:


网络异常,图片无法展示
|


参数类型不对:


abs:

网络异常,图片无法展示
|


my_abs:(这里直接报了if的错误)


网络异常,图片无法展示
|


修改一下my_abs的定义,对参数类型做检查,只允许整数和浮点数类型的参数。数据类型检查可以用内置函数 isinstance() 实现:


网络异常,图片无法展示
|


默认参数:(name,age=18)


一是必选参数在前,默认参数在后,否则Python的解释器会报错(SyntaxError: non-default argument follows default argument)

非默认参数在默认参数之后,很明显 这样做会产生歧义,当你传参时,函数都不知道给哪个赋值好。。


二是如何设置默认参数。 当函数有多个参数时,把变化大的参数放前面,变化小的参数放后面。变化小的参数就可以作为默认参数。 使用默认参数有什么好处?最大的好处是能降低调用函数的难度。


def power(x, n=2):
    s = 1
    while n > 0:
        n = n - 1
        s = s * x
    return s
复制代码


定义默认参数要牢记一点:默认参数必须指向不变对象! 如: str、None , 因为不变对象一旦创建,对象内部的数据就不能修改,这样就减少了由于修改数据导致的错误。此外,由于对象不变,多任务环境下同时读取对象不需要加锁,同时读一点问题都没有。


可变参数: *


可变参数允许你传入0个或任意个参数,这些可变参数在函数调用时自动组装为一个tuple


*变量名 用这样的形式即可接受多个参数,或者tuple,list


def calc(*numbers):
    sum = 0
    for n in numbers:
        sum = sum + n * n
    return sum
total=calc(*[1,2]) # *nums表示把nums这个list的所有元素作为可变参数传进去。
total2=calc(1,2,3)
print(total,total2) # 5 14
复制代码


关键字参数: **


关键字参数允许你传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict。


def person(name, age, **kw):
    print('name:', name, 'age:', age, 'other:', kw)
extra={'city':'Beijing'}
person('Bob', 35, **extra) # 把extra这个dict的所有key-value用关键字参数传入到函数的**kw参数
# name: Bob age: 35 other: {'city': 'Beijing'}
复制代码


注意kw获得的dict是extra的一份拷贝,对kw的改动不会影响到函数外的extra。


命名关键字参数:必填参数


限制关键字参数的名字,例如,只接收city和job作为关键字参数, 可以理解为必填参数,传参的时候必须用key=value的形式: city='Beijing'


def person(name, age, *,city, job):
    print(name, age, city, job)
person('Jack', 24,city='Beijing',job='Engineer')
person('Jack', 24,'Beijing','Engineer') # TypeError: person() takes 2 positional arguments but 4 were given python 
# Python解释器把这4个参数均视为位置参数,但person()函数仅接受2个位置参数
复制代码


函数参数中有可变参数*args,后面的命名关键字参数就不再需要特殊分隔符*了


def person(name, age, *args, city, job):
    print(name, age, args, city, job)
复制代码


命名关键字参数也可以有默认值,这时就可以不传入对应的key参数


def person(name, age, *, city='Beijing', job):
    print(name, age, city, job)
person('Jack', 24, job='Engineer')
Jack 24 Beijing Engineer
复制代码


小结


函数


定义函数时,需要确定函数名和参数个数; 如果有必要,可以先对参数的数据类型做检查; 函数体内部可以用return随时返回函数结果; 函数执行完毕也没有return语句时,自动return None。 函数可以同时返回多个值,但其实就是一个tuple。


参数


参数定义的顺序必须是:必选参数、默认参数、可变参数、命名关键字参数和关键字参数。


def f1(a, b, c=0, *args, **kw):
    print('a =', a, 'b =', b, 'c =', c, 'args =', args, 'kw =', kw)
def f2(a, b, c=0, *, d, **kw):
    print('a =', a, 'b =', b, 'c =', c, 'd =', d, 'kw =', kw)




目录
相关文章
|
2月前
|
存储 数据采集 人工智能
Python编程入门:从零基础到实战应用
本文是一篇面向初学者的Python编程教程,旨在帮助读者从零开始学习Python编程语言。文章首先介绍了Python的基本概念和特点,然后通过一个简单的例子展示了如何编写Python代码。接下来,文章详细介绍了Python的数据类型、变量、运算符、控制结构、函数等基本语法知识。最后,文章通过一个实战项目——制作一个简单的计算器程序,帮助读者巩固所学知识并提高编程技能。
|
2月前
|
分布式计算 MaxCompute 对象存储
|
1月前
|
存储 数据挖掘 数据处理
Python Pandas入门:行与列快速上手与优化技巧
Pandas是Python中强大的数据分析库,广泛应用于数据科学和数据分析领域。本文为初学者介绍Pandas的基本操作,包括安装、创建DataFrame、行与列的操作及优化技巧。通过实例讲解如何选择、添加、删除行与列,并提供链式操作、向量化处理、索引优化等高效使用Pandas的建议,帮助用户在实际工作中更便捷地处理数据。
44 2
|
1月前
|
Python
[oeasy]python057_如何删除print函数_dunder_builtins_系统内建模块
本文介绍了如何删除Python中的`print`函数,并探讨了系统内建模块`__builtins__`的作用。主要内容包括: 1. **回忆上次内容**:上次提到使用下划线避免命名冲突。 2. **双下划线变量**:解释了双下划线(如`__name__`、`__doc__`、`__builtins__`)是系统定义的标识符,具有特殊含义。
31 3
|
1月前
|
JSON 监控 安全
深入理解 Python 的 eval() 函数与空全局字典 {}
`eval()` 函数在 Python 中能将字符串解析为代码并执行,但伴随安全风险,尤其在处理不受信任的输入时。传递空全局字典 {} 可限制其访问内置对象,但仍存隐患。建议通过限制函数和变量、使用沙箱环境、避免复杂表达式、验证输入等提高安全性。更推荐使用 `ast.literal_eval()`、自定义解析器或 JSON 解析等替代方案,以确保代码安全性和可靠性。
40 2
|
1月前
|
人工智能 编译器 Python
python已经安装有其他用途如何用hbuilerx配置环境-附带实例demo-python开发入门之hbuilderx编译器如何配置python环境—hbuilderx配置python环境优雅草央千澈
python已经安装有其他用途如何用hbuilerx配置环境-附带实例demo-python开发入门之hbuilderx编译器如何配置python环境—hbuilderx配置python环境优雅草央千澈
40 0
python已经安装有其他用途如何用hbuilerx配置环境-附带实例demo-python开发入门之hbuilderx编译器如何配置python环境—hbuilderx配置python环境优雅草央千澈
|
27天前
|
存储 人工智能 Python
[oeasy]python061_如何接收输入_input函数_字符串_str_容器_ 输入输出
本文介绍了Python中如何使用`input()`函数接收用户输入。`input()`函数可以从标准输入流获取字符串,并将其赋值给变量。通过键盘输入的值可以实时赋予变量,实现动态输入。为了更好地理解其用法,文中通过实例演示了如何接收用户输入并存储在变量中,还介绍了`input()`函数的参数`prompt`,用于提供输入提示信息。最后总结了`input()`函数的核心功能及其应用场景。更多内容可参考蓝桥、GitHub和Gitee上的相关教程。
16 0
|
2月前
|
数据可视化 DataX Python
Seaborn 教程-绘图函数
Seaborn 教程-绘图函数
83 8
|
9月前
|
算法 Python 容器
Python编程 - 不调用相关choose库函数,“众数“挑选器、随机挑选器 的源码编程实现
Python编程 - 不调用相关choose库函数,“众数“挑选器、随机挑选器 的源码编程实现
112 0
|
5月前
|
算法 Python
Python编程的函数—内置函数
Python编程的函数—内置函数
28 0