函数的创建与调用

#
# 主题:函数的创建与调用
#if __name__ == '__main__':# 创建函数# 求解 a + bdef calc(a, b):c = a + breturn c# 调用函数result = calc(10, 20)print(result)               # 30

函数的参数传递

  • 位置传参

  • 关键字传参

#
# 主题:函数的参数传递
#if __name__ == '__main__':# 位置传参# 求解 a + bdef calc(a, b):     # a,b 是形式参数,简称形参,形参的位置是在函数的定义处c = a + breturn cresult = calc(10, 20)   # 10,20 是实际参数的值,简称实参,实参的位置是在函数的调用处print(result) # 30# 关键字传参result1 = calc(b = 10, a = 20)  # = 左边的变量名称为关键字参数print(result1)  # 30

函数的参数传递对实参的影响

#
# 主题:函数的参数传递对实参的影响
#def fun(arg1, arg2):print('arg1 =', arg1)print('arg2 =', arg2)arg1 = 100arg2.append(10)print('arg1 =', arg1)print('arg2 =', arg2)if __name__ == '__main__':n1 = 11n2 = [22, 33, 44]print(n1)           # 11print(n2)           # [22, 33, 44]print('---')fun(n1, n2)         # arg1 = 11# arg2 = [22, 33, 44]# arg1 = 100# arg2 = [22, 33, 44, 10]print('---')print(n1)           # 11 只是值传递print(n2)           # [22, 33, 44, 10] 相当于C语言中在指针层面上的数据操作'''在函数调用过程中,进行参数的传递若是不可变对象,则在函数体中的修改不会影响实参的值若是可变对象,则在函数体的修改会影响实参的值'''

函数的返回值

#
# 主题:函数的返回值
#def fun(num):odd = []            # 存奇数even = []           # 存偶数for i in num:if i % 2 == 1:odd.append(i)else:even.append(i)return odd, evenif __name__ == '__main__':print(fun([10, 29, 34, 23, 44, 53, 55]))        # ([29, 23, 53, 55], [10, 34, 44])# 若返回值有多个结果,则返回值的类型是元组

函数定义中的形参 —— 默认值

#
# 主题:函数定义中的形参 —— 默认值
#def fun(a, b = 10):print(a, b)if __name__ == '__main__':fun(100)                # 100 10    b未传参,采取默认值fun(20, 30)             # 20 30     30替换10# print函数也有默认值参数。在代码中,按住Ctrl不放,鼠标点击print函数名进入函数定义处print('hello')print('python')         # hello# python# print在字符串的末尾默认加'\n'print('hello', end = '\t')print('world')          # hello     world

函数定义中的形参 —— 个数可变的位置形参

#
# 主题:函数定义中的形参 —— 个数可变的位置形参
#def fun(*args):print(args)def fun1(a, b, c):print('a =', a)print('b =', b)print('c =', c)   if __name__ == '__main__':# 定义函数时,可能无法事先确定传递的位置实参的个数时,使用个数可变的位置参数# 使用一个*定义个数可变的位置形参# 函数的返回值类型是元组fun(10)                     # (10,)fun(10, 'hello', True)     # (10, 'hello', True)''' def fun2(*args, *a):pass以上代码,程序会报错,可变的位置参数,只能是1个'''lst = [11, 22, 33]fun1(*lst)          # 函数调用时,将列表中的每个元素都转换为位置实参传入# a = 11# b = 22# c = 33

函数定义中的形参 —— 个数可变的关键字形参

#
# 主题:函数定义中的形参 —— 个数可变的关键字形参
#def fun(**args):print(args)def fun1(a, b, c):print('a =', a)print('b =', b)print('c =', c)if __name__ == '__main__':# 定义参数时,可能无法事先确定传递的位置实参的个数,这时使用可变的关键字形参# 函数的返回值是字典fun(a = 10)fun(a = 10, b = 'hello', c = True)  # {'a': 10}# {'a': 10, 'b': 'hello', 'c': True}

函数定义中的形参 —— 个数可变的关键字形参

#
# 主题:函数定义中的形参 —— 个数可变的关键字形参
#def fun(**args):print(args)def fun1(a, b, c):print('a =', a)print('b =', b)print('c =', c)def fun3(a, b, *, c, d):        # * 后面的参数,在函数调用时,只能采用关键字参数传递print('a =', a)print('b =', b)print('c =', c)print('d =', d)if __name__ == '__main__':# 定义参数时,可能无法事先确定传递的位置实参的个数,这时使用可变的关键字形参# 函数的返回值是字典fun(a = 10)fun(a = 10, b = 'hello', c = True)  # {'a': 10}# {'a': 10, 'b': 'hello', 'c': True}''' def fun2(**args, **argc):pass以上代码会报错,个数可变的关键字参数,只能是1个'''# 函数定义时,形参的顺序问题# 在定义函数时,个数可变的位置形参要放在个数可变的关键字形参之前def fun2(*args1, **arg2):passdef fun4(a, b, *, c, d, **args):passdef fun5(a, b = 10, *args, **args2):passdic = {'a': 100, 'b': 200, 'c': 300}fun1(**dic)         # 函数调用时,将字典中每个元素都转换为关键字实参传入# a = 100# b = 200# c = 300fun3(a = 10, b = 20, c = 30, d = 40)    # 关键字实参传递# a = 10# b = 20# c = 30# d = 40fun3(10, 20, c = 30, d = 40)            # 前两个参数采用位置实参传递,后两个参数采用关键字实参传递# a = 10# b = 20# c = 30# d = 40

变量的作用域

#
# 主题:变量的作用域
#if __name__ == '__main__':# 局部变量# 在函数被定义并使用的变量,只在函数内部有效# 局部变量使用global声明,这个变量就会成为全局变量def fun(a, b):global d        # d原先是局部变量,经过global声明后变成全局变量c = a + b       # c是局部变量# a,b是函数的形参,作用范围是函数内部,相当于局部变量d = cprint(c)fun(1, 2)           # cprint(d)            # c# 全局变量# 函数体外定义的变量,可作用与函数内外

递归函数

#
# 主题:递归函数
#def fac(n):'''功能:计算阶乘参数:n        变量返回:n!       阶乘结果'''if n == 1:          # 递归终止条件return 1        # 1! = 1else:               # 递归调用return n * fac(n - 1)def fib(n):'''功能:斐波那契数列参数:n        当前数字在数列中是第几个返回:         斐波那契数列'''if n == 1:return 1elif n ==2:return 1else:return fib(n - 1) + fib(n - 2)if __name__ == '__main__':# 递归函数在函数体内调用函数自身# 递归函数的组成部分:递归调用与递归终止条件# 递归函数的调用过程# 每递归调用一次函数,就会在占内存分配一个栈帧# 每执行一次函数,都会释放相应的空间# 递归的优缺点:# 优点:思路和代码简单# 缺点:占用内存多,效率低下# 计算阶乘print(fac(6))           # 720# 计算斐波那契数列中第6位上的数字print(fib(6))           # 8# 输出斐波那契数列前6位的数字for i in range(1, 7):print(fib(i), end = '\t')   # 1    1   2   3   5   8

bug 分类

#
# 主题:bug 分类
#if __name__ == '__main__':# TypeError             数据类型错误# IndexError            索引错误# ZeroDivisionError     除以零# KeyError              键错误# ValueError            值错误# NameError             标识符错误# SyntaxError           语法错误

异常处理机制

#
# 主题:异常处理机制
#if __name__ == '__main__':# try 结构# 当异常出现时,即时捕获,从而保证程序继续执行try:                        # 可能报错的代码n1 = int(input('请输入一个整数:'))n2 = int(input('请输入另一个整数:'))result = n1 / n2print('结果为:', result)except ZeroDivisionError:   # except 后面是错误类型。根据错误类型执行对应的代码print('除数不能为0哦!!!')except ValueError:print('请检查输入是否正确')except BaseException as e:  # 提取错误提示# 正常报错是这样:ValueError: invalid literal for int() with base 10: ''# 执行词句后,e = invalid literal for int() with base 10: ''print(e)print(type(e))          # <class 'ValueError'>  ValueError 是错误类型else:print('结果为:', result) # 若 try 块没有异常,则执行 else 块,否则执行 except 块finally:                    # 无论是否有异常,都会执行这块代码,常用于释放 try 块中申请的资源print('无论是否有异常,都会执行')# traceback 模块打印异常信息# 用于将异常信息存入到日志文件(log日志)里import tracebacktry:print('---')num = 10 / 0except:traceback.print_exc()

python源码中的学习笔记_第8章_函数相关推荐

  1. 生成对抗网络入门详解及TensorFlow源码实现--深度学习笔记

    生成对抗网络入门详解及TensorFlow源码实现–深度学习笔记 一.生成对抗网络(GANs) 生成对抗网络是一种生成模型(Generative Model),其背后最基本的思想就是从训练库里获取很多 ...

  2. CNN入门详解及TensorFlow源码实现--深度学习笔记

    CNN入门详解及TensorFlow源码实现–深度学习笔记 ##一.卷积神经网络 ###1.简介 卷积神经网络是一种前馈神经网络,它的人工神经元可以响应一部分覆盖范围内的周围单元,对于大型图像处理有出 ...

  3. android源代码 abi,Android内核源码Abi目录学习笔记

    好记性不如烂笔头,今天要学习的是Android中Abi目录下的代码.下面是基本的学习的笔记的汇总. 首先是include中的头文件的说明. 在cxxabi的头文件中主要需要掌握下面的几个点: 1.这个 ...

  4. vue 拷贝 数组_vue源码中值得学习的方法

    最近在深入研究vue源码,把学习过程中,看到的一些好玩的的函数方法收集起来做分享,希望对大家对深入学习js有所帮助.如果大家都能一眼看懂这些函数,说明技术还是不错的哦. 1. 数据类型判断 Objec ...

  5. python提取发票信息发票识别_(附完整python源码)基于tensorflow、opencv的入门案例_发票识别二:字符分割...

    (附完整python源码)基于tensorflow.opencv的入门案例_发票识别二:字符分割 发布时间:2018-05-14 20:16, 浏览次数:1201 , 标签: python tenso ...

  6. 《Python源码剖析》读书笔记

    <Python源码剖析>电子书下载 http://download.csdn.net/detail/xiarendeniao/5130403 Python源码在官网有下载链接,用ctags ...

  7. stl源码剖析_《STL源码剖析》学习笔记——空间配置器

    目录 1. 空间配置器概述 2. 构造和析构基本工具 3. 空间的配置与释放,std::alloc 4. 内存基本处理工具 1. 空间配置器概述 从STL的实现角度来看,空间配置器的位置尤为重要,整个 ...

  8. puppet最新源码包安装学习笔记

    最近去面试了2家大的电商网站的运维工作,公司对系统的自动化管理,虚拟化,mysql集群,系统性能的优化和shell及python编程的要求都比较高,虽然没有面试成功,但也明白了2013年自己学习的目标 ...

  9. 源码 状态机_LLVM学习笔记(1)--初探源码

    一直耳闻LLVM相比于GCC: well documented 架构灵活,前后端解耦符合龙书的讲解 昨天读到了一篇虽然概括却很周到的llvm入门导引 陈钦霖:LLVM Pass入门导引​zhuanla ...

  10. 从Mybatis源码中,学习到的10种设计模式

    一.前言:小镇卷码家 总有不少研发伙伴问小傅哥:"为什么学设计模式.看框架源码.补技术知识,就一个普通的业务项目,会造飞机不也是天天写CRUD吗?" 你说的没错,但你天天写CRUD ...

最新文章

  1. re.match()用法详解
  2. 刀片服务器提升三要点
  3. 数组的扩展-搜集自无忧脚本
  4. 拆解 | 某平台19元的儿童电话手表,究竟怎么做到的?
  5. 图表中各个参数的应用( AChartEngine XMultipleSeriesRenderer
  6. erp系统方案书_门禁系统方案书
  7. mysql 8 强制修改密码_Mysql 8.0版本强制无密码进入+更改密码
  8. Dummary、Fake、Stub、Spy、Mock
  9. 通过Spring Boot中的手动Bean定义提高启动性能
  10. 谈谈阿里log4j2事件:严重性是个主观判断
  11. 成语接龙、歇后语 js JavaScript html web nodejs成语接龙离线js库
  12. 关于get方式提交中文乱码问题的解决方式
  13. lqr matlab,MATLAB中的LQR函数用法
  14. 《查拉图斯特拉如是说》读书笔记
  15. SQL实时库存数量结存
  16. 九宫格拼图 | 8Puzzle | C/C++实现
  17. 使用篇十 --- 模板代码创建
  18. 亚马逊、Lazada、shopee、ebay、wish、tiktok、速卖通、乐天、煤炉、独立站、美客多、沃尔玛、阿里国际测评(补单)怎么盈利?怎么做?
  19. 计算机老是卡顿怎么解决,电脑反应太慢怎么处理_电脑卡顿什么原因-win7之家
  20. Linux云计算学习笔记day39

热门文章

  1. Eclipse\myeclipse加载项目building workspace过久
  2. WDCP控制面板的常用liunx命令集
  3. [编织消息框架][消息处理模式]管道模式
  4. [Machine Learning]朴素贝叶斯(NaiveBayes)
  5. 转载CentOS7 yum 安装与配置MySQL5.7
  6. Spring学习笔记3——使用注解的方式完成注入对象中的效果
  7. 170819-关于JSTL的知识点
  8. 【面试题】百度糯米java工程师面试
  9. c语言文件操作——复制文件
  10. java中整数和字符串间的转换方法