一、函数是什么?

函数一次来源于数学,但是编程中的【函数】的概念,与数学中的函数还是有很大的不同的,编程中的函数在英文中也有很多不同的叫法。

在Basic中叫做subroutine(子过程或子程序),在Pasacl中叫做procedure(过程)和funtion,在java中叫做method。

二、使用函数的好处:#函数即变量

1、简化代码

2、提高代码效率

3、代码可扩展

三、函数的定义:

定义函数的关键字是def,后面是函数名+(),函数名不能重复;调用函数:函数名+()

eg:
# def read_users(filename):#形参
# with open(filename) as fr:
# for line in fr:
# up = line.strip().split(',')
# s_username = up[0]
# s_pwd = up[1]
# all_users[s_username]=s_pwd
# read_users('a.txt')#调用参数叫做实参
# print(all_users)

四、函数在调用的时候,可以传入参数,有形参和实参

函数在调用的时候,可以传入参数,有形参和实参

形参:形参只有被调用的时候才分配内存单元,在调用结束后就是放所分配的内存单元,因此形参只在函数内部有效。

实参:

实参可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,他们必须有确定的值,以便把这些值

传送给形参。函数调用结束返回主调用函数后则不能再使用该行参变量。

简单点说,形参就是函数接收的参数,实参就是实际传入的参数。

函数的四种参数:

1、位置参数:字面上的也就是按照参数的位置进行传参比如例子中的read_users函数种的filename,位置参数是必传的,

有几个位置参数在调用就必须传入几个参数,否则就会报错。那如果有多个位置参数的话,记不住那个位置穿那个参数了

怎么办,可以使用位置参数的名字来指定调用,这种调用方式叫做关键字传参

e.g:

def  cal(x,y):

  return x*y

cal(x=4,y=6)

2、默认值参数:

默认值参数就是在定义形参的时候,给函数默认赋一个值,比如数据库的端口这样的,默认给它一个值,这样就算你在调用的时候

没传入这个参数,他也是有值的

所以,默认参数不是必填参数,如果给默认参数传值的话,他就会使用你传入的值。如果使用默认值参数的话,必须放在位置参数

后面定义

e.g:

# def regit(name,age,sex='男'):#age,name必填参数,位置参数,
# # sex定义了一个默认值参数,非必传
# print('hello %s,age is %s,sex is %s'%(name,age,sex))
#
# regit('周杰伦','9090') 非固定参数:
位置参数和默认参数都是参数是固定的,如果一个函数,参数不是固定的,非固定参数分为:可变参数、关键字参数
如果4种参数都有的话,必须按照位置参数、默认值参数可变参数、关键参数的顺序接受否则报错
3、可变参数
可变参数用*来接收,后面想传入多个参数就传入多少个,可变参数也是非必填的
e.g:
# def post(*args):#可变参数,也叫参数组,参数不固定,也不是必填参数
# print(args)
# post('001','denglu','http://baidu.com','post','a=1')
# post('002','denglu')
#
# def other(name,age,country,*args):#接受的是元祖
# print(name)
# print(age)
# print(country)
# print(args)
# other('wubing','999','hehe','beijing','python')
4、关键字参数:
关键字参数**来接收,后面的参数也不固定的,想写多个多少个,当然也可以和上面的集中一起使用,如果一起使用的话,关键字参数必须在最后面
使用关键字参数的话,调用的时候必须使用关键字传参,关键字参数也是非必传的。 e.g:
def kw(**kwargs):
#关键字参数,接受的是一个字典,也不是必填的
#c传入字典的时候就得写**d
print(kwargs)
kw(name='wubing',age='18',sex='女')
# d={'name': 'wubing', 'age': '18', 'sex': '女'}
#
# kw(**d)
# kw() #
# def other2(name,country='China',*args,**kwargs):
# #如果必填参数、默认值参数和可变参数、关键字参数一起用的话
# #必须按照必填参数、默认值参数可变参数、关键参数的顺序接受否则报错
# print(name)
# print(country)
# print(args)
# print(kwargs)
# other2('wubing')
# other2('wubing','beijing','python','cahngping',user='niuhanyang')
五、函数的返回值
每个函数都有返回值,如果没有在函数里面指定返回值的话,在python里面函数执行完之后,默认会返回一个None,
函数也可以有多个返回值,如果有多个返回值的话,会把返回值都放到一个元祖里,返回的是一个元祖。
为什么要有返回值呢?是因为在这个函数操作完之后,它的结果的在后面的程序里里面需要用到。
函数中的返回值使用return,函数在遇到return就立刻结束。
def calc(x,y):
  c =x*y
  return c
resc = calc(5,6)
print(res) e.g:
'''
这个函数是判断传入的是不是小数
return True or False
param 传入一个字符串
'''
# def is_float(s):
# s = str(s)
# print(s)
# if s.isdigit():
# return False
# else:
# if s.count('.') == 1:
# sl = s.split('.')#按照小数点分割
# left = sl[0]
# right = sl[1]
# if left.startswith('-')and left.count('-')==1and right.isdigit():
# lleft= left.split('-')[1]
# if lleft.isdigit():
# return True
# else:
# return False
# elif left.isdigit()and right.isdigit():
# return True
# else:
# return False
# else:
# return False
# print(is_float('1.1'))
六、局部变量和全局变量

局部变量意思就是在局部生效的,出了这个变量的作用域,这个变量就失效了,比如上面的c就是一个局部变量,出了这个函数之后,就没有c这个值了

全局变量的意思就是在整个程序里面都生效的,在程序最前面定义的都是全局变量,全局变量如果要在函数中修改的话,需要加global关键字声明,如果是list、字典和集合的话,则不需要加global关键字,直接就可以修改。


# score3 ={'name':'adidas'}
# def my_open():
# #在函数里定义的变量叫局部变量,他只能在函数里面用
# #除了该函数外,就不能使用了
# #在函数外定义的变量叫做全局变量,在函数内也可以使用
# #如果变量在函数外和函数内都有定义那么函数内取值为函数内定义的变量值
# #如果想在函数里修改全局变量那么要先用global关键字声明
# #global要修改的是int,string类型必须得些global,如果是列表和字典不能加global
# fw = open('a.txt','a+')
# fw.seek(0)
# print(fw.read())
# score3['name'] = 'pppp'
# global score3
# score3['id']='1000'
#
# print(score3)
# my_open()
# # fw.read()
# print(score3)
# #函数及变量 七、递归调用

如果一个函数在内部调用自身本身,这个函数就是递归函数。递归调用的意思就是,在这个函数内部自己调用自己,就有点循环的意思。

# def hello():
# print('hello')
# hello()
#
# hello()

递归调用的特性:

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

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

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

八、高阶函数

如果一个函数的入参是一个函数名的话,那这个函数就是一个高阶函数

# def add(x,y,z):
# return z(x)+z(y)
# print(add('99','121',int))
# 函数里面也可以嵌套的定义函数
# 函数的作用域:是就近原则,从里往外找,如果自己的函数里面有就拿来用,
# 如果自己的函数里面没有的话,就去他的父级里面找
# 函数只有调用才会被执行
e.g:
# name ='python'
# def warpper():
# name ='wubing'
# print('我在外面')
# def deco():
# name = '陈冬瓜'
# print('我在里面%s'%name)
# def hhh():
# name ='张莹'
# print('xxx%s'%name)
# hhh()
# deco()
# print('外面的name是%s' % name)
# warpper()
												

python-笔记(四)函数的更多相关文章

  1. Python:笔记(2)——函数与模块

    Python:笔记(2)——函数与模块 Python函数 关于函数 1.我们可以使用Help来查看函数的帮助信息 2.调用函数的时候,如果传入的参数数量或者类型不符合均会报错. 3.函数名其实就是一个 ...

  2. python学习笔记(四):函数

    一.函数是什么? 函数一词来源于数学,但编程中的「函数」概念,与数学中的函数是有很大不同的,编程中的函数在英文中也有很多不同的叫法.在BASIC中叫做subroutine(子过程或子程序),在Pasc ...

  3. guxh的python笔记四:迭代

    1,可迭代对象iterable,迭代器iterator,生成器generator 可迭代对象iterable: 实现__iter__方法的类.__iter__方法返回iterator或者generat ...

  4. python 基础(四) 函数

    函数 一.什么是函数? 函数是可以实现一些特定功能的 小方法 或者是小程序 优点: 提高 了代码的后期维护 增加了代码的重复使用率 减少了代码量 提高了代码可读性 二.函数的定义 使用 def关键+函 ...

  5. python笔记之函数

    函数 >>> def funTest(param1): ... 'this is function document string.' #正文需要有缩进 ... return par ...

  6. python笔记22-literal_eval函数处理返回json中的单双引号

    前言 在做接口测试的时候,最常见的接口返回数据就是json类型,json类型数据实际上就是字串,通常标准的json格式是可以转化成python里面的对应的数据类型的 有时候开发返回的数据比较坑,不按常 ...

  7. python笔记4 - 函数

    函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 函数能提高应用的模块性,和代码的重复利用率.你已经知道Python提供了许多内建函数,比如print().但你也可以自己创建函数,这 ...

  8. Python笔记008函数(2)

    1.        昨日内容回顾: def 函数(): 函数体 return 值 如果不写return,默认返回None.可以单独返回一个值,也能够以元组的形式返回多个值.(不要把print和retu ...

  9. python笔记四

    #!/usr/bin/env python3 from datetime import datetime, timedelta # datetime是模块,datetime模块还包含一个datetim ...

  10. python笔记-字符串函数总结

    字符串函数: chr() 数字转ASCII chr(96)="a" ord() ASCII转数字 ord("a")=96 isspace() 判断是否为空格 s ...

随机推荐

  1. viewset的使用的方法

    viewset的使用方法中是怎么区分的update和crate modelViewSet中设置了这个类之后,设置了类成员变量:queryset 和 seriazlier class,所以POST操作直 ...

  2. 安装最新版Elasticsearch报错

    1 问题:ERROR: bootstrap checks failed max file descriptors [4096] for elasticsearch process likely too ...

  3. 01-Django-urls

    # Django系统- 环境 - python3.6 - django1.18- 参考资料 - [django中文教程](http://python.usyiyi.cn/)# 环境搭建- anacon ...

  4. vue filters过滤

    <template> <div class="filters"> <h1 v-text="filtersTitle">< ...

  5. Spring基础05——Spring依赖注入的三种方式

    Spring支持3种依赖注入的方式:属性注入.构造器注入.工厂 1.属性注入 属性注入即通过setter方法注入Bean的属性或依赖的对象.使用<property>元素,使用name属性指 ...

  6. STM32程序编写或调试犯过的错误

    1.宏定义后加了分号: eg: define NOKEY_PRES 0;      (❌) define NOKEY_PRES 0      (✔) 2.

  7. zabbix 安装中文无法显示的问题

    vi /usr/share/zabbix/include/locales.inc.php把zh_CN后面参数写true 然后去选择语言吧. 如果,去选择语言的时候,你发现还是不能选择....提示:Yo ...

  8. 2017 BJ ICPC 石子合并变种 向量基本功及分类考察

    E 模拟 #include <bits/stdc++.h> #define PI acos(-1.0) #define mem(a,b) memset((a),b,sizeof(a)) # ...

  9. 带加载进度的Web图片懒加载组件Lazyload

    在Web项目中,大量的图片应用会导致页面加载时间过长,浪费不必要的带宽成本,还会影响用户浏览体验. Lazyload 是一个文件大小仅4kb的图片懒加载组件(不依赖其它第三方库),组件会根据用户当前浏 ...

  10. Django【第17篇】:Django之信号

    django中的信号 Django中的信号及其用法 Django中提供了"信号调度",用于在框架执行操作时解耦. 一些动作发生的时候,系统会根据信号定义的函数执行相应的操作 Dja ...