python学习之第三天

本节内容

1. 函数基本语法及特性

2. 参数与局部变量

3. 返回值

4.递归

5.匿名函数

6.函数式编程介绍

7.高阶函数

8.内置函数

1.函数基本语法及特性

函数是什么?

函数一词来源于数学,但编程中的「函数」概念,与数学中的函数是有很大不同的,具体区别,我们后面会讲,编程中的函数在英文中也有很多不同的叫法。在BASIC中叫做subroutine(子过程或子程序),在Pascal中叫做procedure(过程)和function,在C中只有function,在Java里面叫做method。

定义: 函数是指将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需调用其函数名即可

特性:

  1. 减少重复代码
  2. 使程序变的可扩展
  3. 使程序变得易维护

语法定义


1

2

3

4

def sayhi():#函数名

    print("Hello, I‘m nobody!")

sayhi() #调用函数

可以带参数


1

2

3

4

5

6

7

8

9

10

11

12

13

#下面这段代码

a,b = 5,8

= a**b

print(c)

#改成用函数写

def calc(x,y):

    res = x**y

    return res #返回函数执行结果

= calc(a,b) #结果赋值给c变量

print(c)

2.函数参数与局部变量  

形参变量只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。因此,形参只在函数内部有效。函数调用结束返回主调用函数后则不能再使用该形参变量

实参可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参。因此应预先用赋值,输入等办法使参数获得确定值

默认参数

看下面代码


1

2

3

4

5

6

7

8

9

10

def stu_register(name,age,country,course):

    print("----注册学生信息------")

    print("姓名:",name)

    print("age:",age)

    print("国籍:",country)

    print("课程:",course)

stu_register("王山炮",22,"CN","python_devops")

stu_register("张叫春",21,"CN","linux")

stu_register("刘老根",25,"CN","linux")

发现 country 这个参数 基本都 是"CN", 就像我们在网站上注册用户,像国籍这种信息,你不填写,默认就会是 中国, 这就是通过默认参数实现的,把country变成默认参数非常简单


1

def stu_register(name,age,course,country="CN"):

这样,这个参数在调用时不指定,那默认就是CN,指定了的话,就用你指定的值。

另外,你可能注意到了,在把country变成默认参数后,我同时把它的位置移到了最后面,为什么呢?  

关键参数

正常情况下,给函数传参数要按顺序,不想按顺序就可以用关键参数,只需指定参数名即可,但记住一个要求就是,关键参数必须放在位置参数之后。


1

stu_register(age=22,name=‘alex‘,course="python",)

  

非固定参数

若你的函数在定义时不确定用户想传入多少个参数,就可以使用非固定参数


1

2

3

4

5

6

7

8

9

10

def stu_register(name,age,*args): # *args 会把多传入的参数变成一个元组形式

    print(name,age,args)

stu_register("Alex",22)

#输出

#Alex 22 () #后面这个()就是args,只是因为没传值,所以为空

stu_register("Jack",32,"CN","Python")

#输出

# Jack 32 (‘CN‘, ‘Python‘)

还可以有一个**kwargs


1

2

3

4

5

6

7

8

9

10

def stu_register(name,age,*args,**kwargs): # *kwargs 会把多传入的参数变成一个dict形式

    print(name,age,args,kwargs)

stu_register("Alex",22)

#输出

#Alex 22 () {}#后面这个{}就是kwargs,只是因为没传值,所以为空

stu_register("Jack",32,"CN","Python",sex="Male",province="ShanDong")

#输出

# Jack 32 (‘CN‘, ‘Python‘) {‘province‘: ‘ShanDong‘, ‘sex‘: ‘Male‘}

局部变量  


1

2

3

4

5

6

7

8

9

10

11

name = "Alex Li"

def change_name(name):

    print("before change:",name)

    name = "金角大王,一个有Tesla的男人"

    print("after change", name)

change_name(name)

print("在外面看看name改了么?",name)

输出


1

2

3

before change: Alex Li

after change 金角大王,一个有Tesla的男人

在外面看看name改了么? Alex Li

全局与局部变量

在子程序中定义的变量称为局部变量,在程序的一开始定义的变量称为全局变量。

全局变量作用域是整个程序,局部变量作用域是定义该变量的子程序。

当全局变量与局部变量同名时:

在定义局部变量的子程序内,局部变量起作用;在其它地方全局变量起作用。

3.返回值  

要想获取函数的执行结果,就可以用return语句把结果返回

注意:

  1. 函数在执行过程中只要遇到return语句,就会停止执行并返回结果,so 也可以理解为 return 语句代表着函数的结束
  2. 如果未在函数中指定return,那这个函数的返回值为None

  

  

4. 递归

在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数。


1

2

3

4

5

6

7

8

9

10

11

12

13

def calc(n):

    print(n)

    if int(n/2==0:

        return n

    return calc(int(n/2))

calc(10)

输出:

10

5

2

1

递归特性:

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

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

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

5. 匿名函数

匿名函数就是不需要显式的指定函数


1

2

3

4

5

6

7

8

#这段代码

def calc(n):

    return n**n

print(calc(10))

#换成匿名函数

calc = lambda n:n**n

print(calc(10))

你也许会说,用上这个东西没感觉有毛方便呀, 。。。。呵呵,如果是这么用,确实没毛线改进,不过匿名函数主要是和其它函数搭配使用的呢,如下


1

2

3

res = map(lambda x:x**2,[1,5,7,4,8])

for in res:

    print(i)

输出

1
25
49
16
64

6.函数式编程介绍  

函数是Python内建支持的一种封装,我们通过把大段代码拆成函数,通过一层一层的函数调用,就可以把复杂任务分解成简单的任务,这种分解可以称之为面向过程的程序设计。函数就是面向过程的程序设计的基本单元。

而函数式编程(请注意多了一个“式”字)——Functional Programming,虽然也可以归结到面向过程的程序设计,但其思想更接近数学计算。

我们首先要搞明白计算机(Computer)和计算(Compute)的概念。

在计算机的层次上,CPU执行的是加减乘除的指令代码,以及各种条件判断和跳转指令,所以,汇编语言是最贴近计算机的语言。

而计算则指数学意义上的计算,越是抽象的计算,离计算机硬件越远。

对应到编程语言,就是越低级的语言,越贴近计算机,抽象程度低,执行效率高,比如C语言;越高级的语言,越贴近计算,抽象程度高,执行效率低,比如Lisp语言。

函数式编程就是一种抽象程度很高的编程范式,纯粹的函数式编程语言编写的函数没有变量,因此,任意一个函数,只要输入是确定的,输出就是确定的,这种纯函数我们称之为没有副作用。而允许使用变量的程序设计语言,由于函数内部的变量状态不确定,同样的输入,可能得到不同的输出,因此,这种函数是有副作用的。

函数式编程的一个特点就是,允许把函数本身作为参数传入另一个函数,还允许返回一个函数!

Python对函数式编程提供部分支持。由于Python允许使用变量,因此,Python不是纯函数式编程语言。

一、定义

简单说,"函数式编程"是一种"编程范式"(programming paradigm),也就是如何编写程序的方法论。

主要思想是把运算过程尽量写成一系列嵌套的函数调用。举例来说,现在有这样一个数学表达式:

  (1 + 2) * 3 - 4

传统的过程式编程,可能这样写:

  var a = 1 + 2;

  var b = a * 3;

  var c = b - 4;

函数式编程要求使用函数,我们可以把运算过程定义为不同的函数,然后写成下面这样:

  var result = subtract(multiply(add(1,2), 3), 4);

这就是函数式编程。

好了,我只会这么多了。。。

7.高阶函数

变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数。


1

2

3

4

5

6

def add(x,y,f):

    return f(x) + f(y)

res = add(3,-6,abs)

print(res)

8. 内置参数  

内置参数详解 https://docs.python.org/3/library/functions.html?highlight=built#ascii

  

  

  

分类: Python自动化开发之路

时间: 2024-11-05 15:29:02

python学习之第三天的相关文章

Python学习系列(三)(字符串)

Python学习系列(三)(字符串) 一个月没有更新博客了,最近工作上有点小忙,实在是没有坚持住,丢久又有感觉写的必要了,可见本人的坚持精神不佳,本系列没有任何目的,纯属业余学习,或者说是一时兴趣所致.通过本文,能够学习字符串的基本操作,日积月累,多多练习,学到了,会用了才是王道. 一.基本概念 1,关于转义问题 1)"''"方式: >>> s="Hello 'Jack'--" >>> print s Hello 'Jack'--

读书分享全网学习资源大合集,推荐Python学习手册等三本书「01」

0.前言 在此之前,我已经为准备学习python的小白同学们准备了轻量级但超无敌的python开发利器之visio studio code使用入门系列.详见 1.PYTHON开发利器之VS Code之初识.简介.安装.中文 2.PYTHON开发利器之VS Code 主题.界面美化.快捷键.编辑器技巧 3.PYTHON开发利器之VS Code 常用插件介绍 4.PYTHON开发利器之使用VS Code进行python程序开发 5.1.PYTHON开发利器之使用VS Code+Git进行python

Python学习系列(三)Python 入门语法规则1

一.注释 ''' 多行注释 ''' #单行注释 '''    #example1.1 测试程序  时间:4/17/2017 i1=input("请输入用户名:") i2=input("请输入密码") print (i1) print(i2) print("ainiyou") ''' 二.变量 1)(规则同c里面的规则相同) 2)不能使python内部的关键字 三.基本的数据类型 1)数字 age=24 2)字符串 name="yuang

Python学习笔记总结(三)类

一.类简单介绍 1.介绍 类是Python面向对象程序设计(OOP)的主要工具,类建立使用class语句,通过class定义的对象. 类和模块的差异,类是语句,模块是文件. 类和实例 实例:代表程序领域中具体的元素. 类是生产实例的工厂,实例就像带有“数据"的记录,而类是处理这些记录的“程序”. 类是实例工程,类的属性提供行为(数据以及函数[方法]),所有从类产生的实例都继承该类的属性. 类的一个实例可以通过:实例.属性,实例.方法,获得类的属性和方法调用.类支持继承,当我们对class语句产生

Python学习笔记整理(三)Python中的动态类型简介

Python中只有一个赋值模型 一.缺少类型声明语句的情况 在Python中,类型是在运行过程中自动决定的,而不是通过代码声明.这意味着没有必要事声明变量.只要记住,这个概念实质上对变量,对象和它们之间的关系都适用.那么这个概念也容易理解并掌握. 1.变量,对象和引用 变量创建:一个变量,当代码第一次给它赋值时它就被创建了.之后的赋值将会改变已创建的变量名的值.Python在代码运行之前先检测变量名,可以当成是最初的赋值创建变量. 变量类型:变量永远不会有任何的它关联的类型信息或约束.类型的概念

python学习随笔(三)

三.字典学习 1 #创建一个字典,键可以是一个数字或者一个字符串,值可以为数字.字符串.列表.字典等 2 dict1 = dict({'z':'sw'}) 3 4 #或者 5 dict2 = {'z':'sw'} 1 #清空列表中的元素 2 dict1 = dict({'z':'sw'}) 3 dict1.clear() 4 print(dict1) --> {} 1 #复制一个字典 2 dict1 = dict({'z':'sw'}) 3 dict2 = dict1.copy() 4 prin

Python学习笔记(三)数据类型

在内存中存储的数据可以有多种类型,在Python中,能够直接处理的数据类型有以下几种: 数字(Numbers) 字符串(String) 列表(List) 元组(Tuple) 字典(Dictionary) 集合(Set) 布尔值 一.数字(int.long.float.complex) 数字数据类型用于存储数值:他们是不可改变的数据类型,这意味着改变数字数据类型会分配一个新的对象. 当你指定一个值时,Number对象就会被创建: 可以使用del语句删除一些对象的引用 del语句的语法: 1 del

Python学习日志(三)

运算补充(因为之前看书看过的我又忘了...) python3 里 / 直接是浮点除.python2的 / 是直接整除,取整数部分,小数不要了,python3也可以这样整除,用//实现. **是乘方!!!3**2=8.这个运算符有点个性啊. 比起左侧的操作符优先级高,比右侧优先级低.看图: 第一句**比左侧优先级高,因此先乘方再加负号. 第二句**比右侧优先级低,因此先加负号再乘方. 其实跟我们自己来算是一样的,但是就是想夸一下python,就我学到的知识,光运算和懒逻辑这两点就让我觉得它比我的脑

[python]python学习笔记(三)——编译

11,如何编译编译python脚本为pyc格式 [cpp] view plaincopy #!/usr/bin/python import py_compile; import sys; file=raw_input("enter your file name"); py_compile.compile(file); sys.exit();  12,python的glob模块~ glob模块是python自带的模块,可以用它来查找符合特定规则的文件路径名和文件.查找文件只用到三个匹配符

python学习——基础(三)

定义函数时,需要确定函数名和参数个数: 如果有必要,可以先对参数的数据类型做检查: 函数体内部可以用return随时返回函数结果: 函数执行完毕也没有return语句时,自动return None. 函数可以同时返回多个值,但其实就是一个tuple. 默认参数 # 该方法的扩展,由调用者可以自动求三次方.四次方 def power(x, n=2): if not isinstance(x, (int, float)): raise TypeError('传的参数必须是整型或浮点型') sum =