1.函数的初识

  1. 初始函数
  1. 获取任意一个字符串的元素的个数
  2. s1='dsjdkjkfefenga'
  3. count=0
  4. for i in s1:
  5. count+=1
  6. print(count)
  7. 获取列表的元素的个数
  8. l1 = [1, 2, 3]
  9. count = 0
  10. for i in l1:
  11. count += 1
  12. print(count)
  13. 面向过程编程
  14. 1. 代码重复。
  15. 2. 代码可可读性不高
  16. 初始函数
  17. l1 = [1, 2, 3]
  18. def new_len():
  19. count = 0
  20. for i in l1:
  21. count += 1
  22. print(count)
  23. new_len()

函数:函数是以功能为导向,一个函数封装一个功能。登录,注册,文件的改的操作.....

函数减````少代码的重复性,增强了代码的可读性。

2.函数的结构

  1. l1 = [1, 2, 3]
  2. def new_len():
  3. count=0
  4. for i in l1:
  5. count +=1
  6. print(count)
  7. new_len()
  8. '''
  9. def 关键字:定义一个函数,紧跟一个空格
  10. new_len函数名:与变量名规范一致。一定要具有可描述性。
  11. ():结构需要,传参使用。
  12. :分割符
  13. tab键:四个空格。缩进。函数体
  14. '''

3.函数的调用

  1. l1 = [1, 2, 3]
  2. def new_len():
  3. count = 0
  4. for i in l1:
  5. count += 1
  6. print(count)
  7. 函数的执行写多少次,执行多少次。
  8. new_len() # 函数名() 函数的执行者。调用者。
  9. new_len() # 函数名() 函数的执行者。
  10. new_len() # 函数名() 函数的执行者。
  11. new_len() # 函数名() 函数的执行者。
  12. new_len() # 函数名() 函数的执行者。
  13. l1 = [1, 2, 3]
  14. def new_len():
  15. count = 0
  16. for i in l1:
  17. count += 1
  18. print(count)
  19. for i in range(10):
  20. print(111)
  21. for i in range(3):
  22. new_len()
  23. '''
  24. 先打印111 10次,
  25. 在调用函数3次

4.函数的返回值

一个函数就是封装一个功能,这个功能一般都会有一个最终结果的,比如你写一个登录函数,最终登录成功与否是不是需要返回你一个结果?还有咱们是不是都用过len这个函数,他是获取一个对象的元素的总个数,最终肯定会返回一个元素个数这样的结果:

  1. s='dsfge'
  2. print(len(s))

函数的返回值用return表示:

  1. 结束函数。
  1. l1 = [1,2,3]
  2. def new_len():
  3. print(111)
  4. print(222)
  5. if 1==1:#先判断条件成立,才执行return,结束后面的函数,不然不会结束后面的函数。
  6. return
  7. print(333)
  8. print(444)
  9. new_len()

2.函数中没有return或者只写一个return,函数的执行者得到的是None

  1. l1 = [1, 2, 3]
  2. def new_len():
  3. count=0
  4. for i in l1:
  5. count +=1
  6. return
  7. print(new_len())
  8. '''
  9. 3
  10. None
  11. '''

3.函数中return后面是单个值,函数的执行者得到的是这个值(不改变值的类型)

  1. def func():
  2. print(11)
  3. return 1,'23',[1,2]
  4. ret=func()
  5. print(ret,type(ret))#(1,'23',[1,2])
  6. def func():
  7. print(11)
  8. return 1,'32',[22,33]
  9. a,b,c=func()
  10. print(a,b,c)#1,32,[22,33]
  11. def func():
  12. print(123)
  13. # return 1+1+2 4
  14. return 2>1 True
  15. ret=func()
  16. print(ret)
  17. '''
  18. 123
  19. True
  20. '''

5.函数的传参

我们上面研究了,函数的结构,函数的执行,以及函数的返回值。对函数有一个初步的了解,那么接下来就是一个非常重要的知识点,函数的参数。函数是以功能为导向的,上面我们写的函数里面的代码都是写死的,也就是说,这个函数里面的更改起来很麻烦,试想一下,我们使用探探,陌陌等软件,可不可以进行筛选,比如选择性别,年龄等,导出结果? 再拿我们之前学过的len 这个len是不是可以获取字符串的总个数?是不是可以获取列表的总个数?你更改了len函数内部的代码了?没有吧?你看下面的例子:

  1. s1 = 'sfdas'
  2. l1 = [1, 3, 7]
  3. print(len(s1)) # 5
  4. print(len(l1)) # 3
  1. 函数的传参:函数的拓展性
  2. def new_len(a):
  3. count=0
  4. for i in a:
  5. count+=1
  6. return count
  7. l1=[1,2,3]
  8. s1='dsjkfejg'
  9. print(new_len(l1))#函数的调用者:参数 实参
  10. print(new_len(s1))#函数的调用者:参数 实参
  11. print(len(s1))

实参角度:

  1. 位置参数
  2. 关键字参数
  3. 混合参数

形参角度:

  1. 位置参数
  2. 默认参数
  3. 动态参数
  4. 仅限关键字参数(了解)
5.1 实参角度:3种
  1. 位置参数
  1. 位置参数:从左至右,按照顺序,一一对应
  2. def meet(sex,age,job):
  3. print('左滑一下')
  4. print('左划一下')
  5. print('右划一下')
  6. print(f'寻找性别{sex},年龄{age}岁,{job}')
  7. print('聊天')
  8. print('约吗')
  9. print('约....')
  10. meet('女','18~25','讲师')

写一个函数,接收两个数字的参数,将较大的数字返回。

  1. def comp(a,b):
  2. if a>b:
  3. return a
  4. else:
  5. return b
  6. ret=comp(1,2000)
  7. print(ret)
5.2 三元运算符:简单的if else.
  1. a1=1
  2. b2=2
  3. ret=a1 if a1>b2 else b2
  4. print(ret)
  5. def comp(a,b):
  6. ret=a if a>b else b
  7. return ret
  8. return a if a>b else b
  9. ret=comp(1,2000)
  10. print(ret)
5.3 关键字参数。一一对应
  1. def meet(sex,age,job,hight,weight):
  2. print('左划一下')
  3. print('右划一下')
  4. print(f'寻找性别{sex},年龄{age}岁,身高{hight},体重{weight},工作{job}')
  5. print('聊天')
  6. print('约吗')
  7. print('约....')
  8. meet(sex='女'job='学生'weight=120,hight=170,age='18-23')
5.4 混合参数。

关键字参数一定在位置参数后面,一一对应。

  1. def meet(sex,age,job,hight,weight,):
  2. print('左划一下')
  3. print('右划一下')
  4. print(f'寻找性别{sex},年龄{age}岁,身高{hight},体重{weight},工作{job}')
  5. print('聊天')
  6. print('约....')
  7. meet('男'27'ITC语言',weight=120,hight=175,)
5.5 形参角度:4种

1.位置参数:与实参角度位置参数一样。

  1. def meet(sex,age,job,hight,weight):
  2. print('左滑一下')
  3. print('左划一下')
  4. print('右划一下')
  5. print(f'寻找性别{sex},年龄{age}岁,{job}')
  6. print('聊天')
  7. print('约吗')
  8. print('约....')
  9. meet('女','18~25','讲师')

2.默认参数:一定在位置参数后面,不传参数即沿用默认的参数。

  1. #open('文件的改',encoding='utf-8')
  2. def meet(age,job,sex='女')
  3. print('左划一下')
  4. print('右划一下')
  5. print(f'寻找性别{sex},年龄{age}岁,{job}')
  6. print('聊天')
  7. print('约吗')
  8. print('约....')
  9. # meet('18~25','幼师')
  10. # 更改默认参数
  11. #meet('18~25','幼师',sex='laddy_boy')#以关键字参数修改默认参数
  12. meet('18~25','幼师','laddy_boy')#以位置参数修改默认参数。

6.函数的传参:*args,**kwargs

第三种传参方式

动态参数 :*args

  1. def eat(food1,food2,food3):
  2. print(f'我请你吃:{food1},{food2},{food3}')
  3. eat('蒸羊羔','蒸熊掌','蒸鹿尾','烧花鸭','烧企鹅')
  4. 当给函数传入的参数数目不定时,之前的传参方式解决不了问题。

*将实参角度:定义一个函数时, 所有的位置参数聚合到一个元组中。*

  1. def eat(*args): # 将实参角度:定义一个函数时,* 所有的位置参数聚合到一个元组中。
  2. print(args)
  3. print(f'我请你吃:{args}')
  4. eat('蒸羊羔','蒸熊掌','蒸鹿尾','烧花鸭','烧企鹅')

函数接收不定个数的数字实参,将最终的和返回出去。

  1. def sum1(*args):
  2. print(args)(100, 2, 67, 3)
  3. result=0
  4. for i in args:
  5. result +=i
  6. return result
  7. print(sum1(100,2,67,3))

**** **kwargs 函数的定义时:将实参角度所有的关键字参数聚合成了一个字典,给了kwargs.

  1. def func(**kwargs):#函数的定义时:**将实参角度所有的关键字参数聚合成了一个字典,给了kwargs.
  2. print(kwargs)
  3. func(name='alex',age=84,hobby='唱跳rap篮球')
6.1 *的魔性用法: (函数中)
  1. def func(*args,**kwargs):
  2. print(args) # (1, 2, 3,'太白', 'wusir', '景女神')
  3. print(kwargs)
  4. l1 = [1, 2, 3]
  5. l2 = ['太白', 'wusir', '景女神']
  6. # func(l1,l2)
  7. # func(*l1,*l2) # 当函数的执行时:*iterable 代表打散。
  8. func(*[1, 2, 3],*(11,22),*'fdsakl') # 当函数的执行时:*iterable 代表打散。
  9. def func(*args,**kwargs):
  10. print(args)
  11. print(kwargs)
  12. func(**{'name':"alex"},**{'age': 73,'hobby': '吹'})
  13. 当函数的执行时:**dict 代表打散。
6.2 函数外:处理剩余元素
  1. a,b,*c = [1,2,3,4,5]
  2. a,*c,b, = [1,2,3,4,5]
  3. a,*c = range(5)
  4. a,*c,b = (1,2,3,4,5,6)
  5. print(a,c,b)

7.形参角度的形参顺序

顺序:位置参数,*args,默认参数,仅限关键字参数,**kwargs

*args

  1. *args不能放在位置参数前面,a,b取不到值。
  2. def func(*args,a,b,sex='man',):
  3. print(a)
  4. print(b)
  5. print(sex)
  6. print(args)
  7. # print(kwargs)
  8. func(1,2,4,5,6)
  9. args如果想要接收到值之前,肯定要改变sex默认参数。
  10. def func(a,b,sex='man',*args):
  11. print(a)
  12. print(b)
  13. print(sex)
  14. print(args)
  15. # print(kwargs)
  16. func(1,2,4,5,6)
  17. def func(a,b,*args,sex='man'):
  18. print(a)
  19. print(b)
  20. print(sex)
  21. print(args)
  22. # print(kwargs)
  23. func(1,2,4,5,6)
  24. func(1,2,4,5,6,sex='women')

**kwargs

  1. 位置参数,*args,默认参数,**kwargs
  2. def func(a,b,*args,sex='man',**kwargs,):
  3. print(a)
  4. print(b)
  5. print(sex)
  6. print(args)
  7. print(kwargs)
  8. func(1,2,4,5,6,name='太白',age=18)

形参角度第四种传参方式:仅限关键字参数 (了解)

  1. 位置参数,*args,默认参数,仅限关键字参数,**kwargs
  2. def func(a,b,*args,sex='man',c,**kwargs,):
  3. print(a)
  4. print(b)
  5. print(sex)
  6. print(c)
  7. print(args)
  8. print(kwargs)
  9. func(1,2,4,5,6,67,c=666,name='太白',age=18,)

8.三个名称空间

变量名(函数名也叫变量)

全局名称空间**: py文件运行时开辟的,存放的是执行的py文件(除去函数内部)的所有的变量与值(地址)的对应关系,函数名与函数内存地址的对应关系。整个py文件结束之后,才会消失。

临时(局部)名称空间: 函数执行时,在内存中临时开辟的一个空间,存放的函数中的变量与值的对应关系,随着函数的结束而消失。

内置名称空间:input,print,内置函数等。

  1. input=12
  2. print(input)
  3. 从全局寻找input------->全局名称空间---------->内置
  4. input = '太白'
  5. def func():
  6. # input = 666
  7. print(input)
  8. func()
  9. 从局部寻找input----->局部名称空间----->全局名称空间——————> 内置
  10. 取值顺序:单向不可逆(LEGB)
  11. def func():
  12. name = 'alex'
  13. func()
  14. print(name)
  15. 此时无法取到值,随着函数的结束内存空间消失
  16. name = '太白'
  17. def func():
  18. # name = 'alex'
  19. def inner():
  20. print(name)
  21. inner()
  22. func()
  23. '''
  24. 太白
  25. '''

9.内置函数:locals globals

globals:全局作用域所有的内容

locals:当前位置的变量与值的对应关系

  1. """
  2. 此文件研究的是内置函数 globals locals
  3. """
  4. name = 'alex'
  5. l1 = [1, 2, 3]
  6. def func():
  7. age = '18'
  8. func()
  9. print(globals()) # 全局作用域所有的内容
  10. print(locals()) # 当前位置
  1. """
  2. 此文件研究的是内置函数 globals locals
  3. """
  4. name = 'alex'
  5. l1 = [1, 2, 3]
  6. def func():
  7. age = '18'
  8. oldboy = '老男孩教育'
  9. print(globals()) # 全局作用域所有的内容
  10. print(locals()) # 当前位置的变量与值的对应关系
  11. func()
  12. '''
  13. {'__name__': '__main__', '__doc__': '\n此文件研究的是内置函数 globals locals\n', '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x00000069B284C0F0>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'C:/Users/Administrator/Desktop/python23期/教学代码/day10 函数的传参,args kwargs,内置函数,高阶函数/05 内置函数:locals globals.py', '__cached__': None, 'name': 'alex', 'l1': [1, 2, 3], 'func': <function func at 0x00000069B2909AE8>}
  14. {'oldboy': '老男孩教育', 'age': '18'}
  15. '''
  1. def func():
  2. age = '18'
  3. oldboy = '老男孩教育'
  4. def inner():
  5. name_class = 'python23期'
  6. print(globals()) # 全局作用域所有的内容
  7. print(locals()) # 当前位置的变量与值的对应关系
  8. inner()
  9. func()
  10. '''
  11. {'__name__': '__main__', '__doc__': '\n此文件研究的是内置函数 globals locals\n', '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x00000038F66EC0F0>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'C:/Users/Administrator/Desktop/python23期/教学代码/day10 函数的传参,args kwargs,内置函数,高阶函数/05 内置函数:locals globals.py', '__cached__': None, 'name': 'alex', 'l1': [1, 2, 3], 'func': <function func at 0x00000038F67A9AE8>}
  12. {'name_class': 'python23'}
  13. '''

10.高阶函数(嵌套函数)

  1. 1
  2. def func1():
  3. print('in func1')
  4. print(3)
  5. def func2():
  6. print('in func2')
  7. print(4)
  8. func1()
  9. print(1)
  10. func2()
  11. print(2)
  12. '''
  13. in func1
  14. 3
  15. 1
  16. in func2'
  17. 4
  18. 2
  19. '''
  20. 例2:
  21. def func1():
  22. print('in func1')
  23. print(3)
  24. def func2():
  25. print('in func2')
  26. func1()
  27. print(4)
  28. print(1)
  29. func2()
  30. print(2)
  31. '''
  32. 1
  33. in func2
  34. in func1
  35. 3
  36. 4
  37. 2
  38. '''
  39. 例3:
  40. def fun2():
  41. print(2)
  42. def func3():
  43. print(6)
  44. print(4)
  45. func3()
  46. print(8)
  47. print(3)
  48. fun2()
  49. print(5)
  50. '''
  51. 3 2 4 6 8 5
  52. '''

11.作用域

全局作用域:全局名称空间,内置名称空间。

局部作用域:局部名称空间。

1.函数的结构,调用,传参,形参,实参,args,kwargs,名称空间,高阶函数的更多相关文章

  1. python基础编程: 编码补充、文件操作、集合、函数参数、函数递归、二分查找、匿名函数与高阶函数

    目录: 编码的补充 文件操作 集合 函数的参数 函数的递归 匿名函数与高阶函数 二分查找示例 一.编码的补充: 在python程序中,首行一般为:#-*- coding:utf-8 -*-,就是告诉p ...

  2. [Node.js] 闭包和高阶函数

    原文地址:http://www.moye.me/2014/12/29/closure_higher-order-function/ 引子 最近发现一个问题:一部分写JS的人,其实对于函数式编程的概念并 ...

  3. Kotlin——高级篇(二):高阶函数详解与标准的高阶函数使用

    在上面一个章节中,详细的讲解了Kotlin中关于Lambda表达式的语法以及运用,如果还您对其还不甚理解,请参见Kotlin--高级篇(一):Lambda表达式详解.在这篇文章中,多次提到了Kotli ...

  4. 如何在JavaScript中使用高阶函数

    将另一个函数作为参数的函数,或者定义一个函数作为返回值的函数,被称为高阶函数. JavaScript可以接受高阶函数.这种处理高阶函数的能力以及其他特点,使JavaScript成为非常适合函数式编程的 ...

  5. Javascript 闭包与高阶函数 ( 一 )

    上个月,淡丶无欲 让我写一期关于 闭包 的随笔,其实惭愧,我对闭包也是略知一二 ,不能给出一个很好的解释,担心自己讲不出个所以然来. 所以带着学习的目的来写一写,如有错误,忘不吝赐教 . 为什么要有闭 ...

  6. 【python】-- 递归函数、高阶函数、嵌套函数、匿名函数

    递归函数 在函数内部,可以调用其他函数.但是在一个函数在内部调用自身,这个函数被称为递归函数 def calc(n): print(n) if int(n/2) == 0: #结束符 return n ...

  7. js高阶函数的理解

    高阶函数:英文叫Higher-order function.JavaScript的函数其实都指向某个变量.既然变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数 ...

  8. JS中的高阶函数

    JS中的高阶函数 高阶函数是指以函数作为参数的函数,并且可以将函数作为结果返回的函数. 1. 高阶函数 接受一个或多个函数作为输入 输出一个函数 至少满足以上一个条件的函数 在js的内置对象中同样存在 ...

  9. c#语言-高阶函数

    介绍 如果说函数是程序中的基本模块,代码段,那高阶函数就是函数的高阶(级)版本,其基本定义如下: 函数自身接受一个或多个函数作为输入. 函数自身能输出一个函数,即函数生产函数. 满足其中一个条件就可以 ...

  10. 匿名方法,Lambda表达式,高阶函数

    原文:匿名方法,Lambda表达式,高阶函数 匿名方法 c#2.0引入匿名方法,不必创建单独的方法,因此减少了所需的编码系统开销. 常用于将委托和匿名方法关联,例如1. 使用委托和方法关联: this ...

随机推荐

  1. B. Drazil and His Happy Friends

    这是 Codeforces Round #292 (Div. 2)的一道题,原题在这里,题意就是: 小明有n个男同学(编号为 0 ~ n-1)和m个女同学 (编号为 0 ~ m-1),小明要安排男女之 ...

  2. jQuery 网页禁止复制

    <script type="text/javascript">    $(document).ready(function(){         $('#文本框id') ...

  3. Git core objects

    Git core objects Core objects in git blob object tree object commit object Git low level commands gi ...

  4. 小米系列手机调试Installation failed with message Failed to establish session

    用Android studio 2.3调度程序时提示"Installation failed with message Failed to establish session"错误 ...

  5. 用vector代替实现二维数组

    vector可以用来模拟数组,当然也可以用来模拟二维数组: 定义如:vector<int>a[100];   相当于定义了一个100行的数组,当每行的大小是不确定的 模板应用如下: #in ...

  6. tensorflow学习官网地址

    摘自: http://wiki.jikexueyuan.com/project/tensorflow-zh/tutorials/overview.html 内容很多,需要花时间看完

  7. 尚学堂xml学习笔记

    1.打开eclipse,文件-新建java project,输入文件的名字,比如输入20181112. 2.对着src右键,选择new-file,输入文件名字,比如:book.xml. 3.开始写.x ...

  8. 使用 DNSPOD API 实现域名动态解析

    0. 简单概述在家里放一个 NAS 服务器,但是宽带的 IP 地址经常改变,一般路由器自带的花生壳域名解析可以解决,如果路由器没有类似功能或者想使用自己的域名,可以尝试使用 DNSPOD API 来实 ...

  9. linux命令学习笔记(44):top命令

    top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管 理器.下面详细介绍它的使用方法.top是一个动态显示过程,即可以通过用户按键来不断刷 ...

  10. TCP协议与流通信

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! TCP(Transportation Control Protocol)协议与IP ...