C语言基础学习PYTHON——基础学习D03

20180804内容纲要:

  1 函数的基本概念

  2 函数的参数

  3 函数的全局变量与局部变量

  4 函数的返回值

  5 递归函数

  6 高阶函数

  7 匿名函数

  8 函数式编程

  9 小结

  10 小练习:ATM+购物车程序

1 函数的基本概念

  a 函数定义

  b 函数特性

  c 定义函数

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

b 特性:

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

c:语法

 def定义函数的关键字
func1 函数名
():内定义形参
注释:文档描述(非必要,但是强烈建议为函数添加描述信息)
代码块
return返回值
'''

函数定义语法

~据说函数式编程和面向过程有点像。貌似是过程是没有返回值的函数

 #函数
def func2():
'''the function definitions'''
print('in the func2')
return 0
#过程
def func3():
'''the function definitions'''
print('in the func3') x=func2()
y=func3()
print('from func2 return is %s'%x)
print('from func3 return is %s'%y)

要不要看一眼

2 函数的参数

  a 形参实参

  b 默认参数

  c 关键字参数

  d 非固定参数

a 形参实参

 #Author:ZhangKanghui

 def multi(x,y):         #x,y形参
res =x**y
return res
a =multi(3,4) #3,4实参
print(a)

这个很容易理解

b 默认参数

def info(name,age,contry="China"):

这样,country这个参数在调用时不指定就用默认值,指定的话就用指定值。

c 关键字参数

 def info(name,age,country="China"):
print ("————info————")
print ("姓名:",name)
print ("年龄:",age)
print("国籍:",country) info(age=23,name='Zhangkanghui')
info(age=23,name='Zhangkanghui',country='CN')

也能感受到默认参数

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

 #关键字参数必须在位置参数后面
def func_name(arg1,arg2,arg3):
pass func_name(arg1=9,arg3=6,3)
# SyntaxError: positional argument follows keyword argument

view code

d 非固定参数

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

  • *args会把传入的参数组成一个元组
  • *kwargs会把传入的参数组成一个字典
 def info(name,age,*args): # *args 会把多传入的参数变成一个元组形式
print(name,age,args) info("Kanghui",22)
#输出
#Kanghui 22 () #后面这个()就是args,只是因为没传值,所以为空 info("Jack",32,"CN","Python")
#输出
# Jack 32 ('CN', 'Python')

*args

 def info(name,age,*args,**kwargs): # *kwargs 会把多传入的参数变成一个dict形式
print(name,age,args,kwargs) info("Kanghui",22)
#输出
#Kanghui 22 () {}#后面这个{}就是kwargs,只是因为没传值,所以为空 info("Jack",32,"CN","Python",sex="Male",province="ShanDong")
#输出
# Jack 32 ('CN', 'Python') {'province': 'ShanDong', 'sex': 'Male'}

*kwargs

3 函数的全局变量和局部变量

全局变量和局部变量

作用域不同:

全局变量作用域是整个程序,局部变量作用域是定义该变量的子程序。
当全局变量与局部变量同名时:在定义局部变量的子程序内,局部变量起作用;在其它地方全局变量起作用。
 #Author:ZhangKanghui

 name = "Kanghui"

 def change_name(name):
print("before change:", name)
name = "kanghui"
print("after change", name)
change_name(name)
print("在外面看看name改了么?", name)

看完代码你就明白了

 #Author:ZhangKanghui
#全局变量与局部变量的访问顺序
x=0
def gandpa():
x=1
def dad():
x=2
def son():
x=3
print(x)
son()
dad()
gandpa()

关于局部变量和全局变量的访问顺序

4 函数的返回值

无return->None
return 1个值->返回1个值
return 逗号分隔多个值->元组

返回值有什么用?

    调用函数,经过一系列的操作,最后要拿到一个明确的结果,则必须要有返回值
    通常有参函数需要有返回值,输入参数,经过计算,得到一个最终的结果

函数在执行过程中只要遇到return语句,就会停止执行并返回结果, return 语句代表着函数的结束。

5 递归函数

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

 #其实我觉得就是类似于迭代
def calc(n):
print(n)
if int(n/2)==0:
return n
return calc(int(n/2))
calc(10)

递归是怎么回事呢?

递归特性:

1. 必须有一个明确的结束条件,不然就进入无限循环状态,当然不会真的无限循环,系统默认999次。

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

堆栈扫盲   http://www.cnblogs.com/lln7777/archive/2012/03/14/2396164.html     或者点击这里

递归函数实际应用案例:二分查找

6 高阶函数

一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数。下一节会有更详细的讲解和应用。配合嵌套函数完成生成器的功能。
 #函数的变量参数还是个函数
def add(x,y,f):
return f(x)+f(y) a =add(3,-6,abs)
print(a)

高阶函数

7 匿名函数

不需要显实的定义函数。
 calc =lambda x:x*3
print(calc(3))

但是,只能支持一些比较简单的函数运算。稍微复杂一些也是极限了。

 calc2 =lambda m: 3 if m<4 else m
print(calc2(5))

不过匿名函数主要是和其它函数搭配使用的。

(lambda n:print(n))(5)
print(lambda n:print(n)(5))
print(lambda n:print(n)) print(filter(lambda n:n>5, range(10)))
res1 =filter(lambda n:n>5, range(10))
for i in res1:
print(i)
res2 =map(lambda n:n*2,range(10)) #列表生成式[i*2 for i in range(10)]
#res2 =[lambda i:i*2 for i in range(10)]
for i in res2:
print(i)

关于匿名函数的一些其他用法

 import functools
res3 =functools.reduce(lambda x,y:x+y,range(10)) #累加
print(res3) res4 =functools.reduce(lambda x,y:x*y,range(1,9)) #阶乘

实现累加和阶乘

8 函数式编程
函数是Python内建支持的一种封装,我们通过把大段代码拆成函数,通过一层一层的函数调用,就可以把复杂任务分解成简单的任务,这种分解可以称之为面向过程的程序设计。
函数就是面向过程的程序设计的基本单元。 举例来说:如果有一个数学表达式是这样的:
 (1+2)*3-4

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

 var a =1+2
var b =a*3
var c =b-4

函数式编程要求使用函数,然后就写成下面这个样子:

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

要想学好函数式编程,不要玩py,玩Erlang,Haskell, 好了!

9 小结

函数就是逻辑结构化和过程化,将一些常用的功能编程封装成一个函数,需要时调用即可。就是将特殊化转变成一般化。
这种思维方式在很多地方都能见到,最常见的比如短信的快速回复。预先设置好,需要时即可拿出用。
·
还能坚持下去吗?
10 练习(ATM)

需求:

模拟一个ATM+购物商城的小程序

1 额度15000或者自定

2 实现购物商城,买东西加入购物车,调用信用卡借口结账

3 可以提现,手续费5%

4 每月22出账单,每月10号为还款日,过期未还,按欠款额度万分之五按日计息

5 支持多账户登录

6 支持账户间转账

7 记录每月日常消费流水

8 提供还款接口

9 ATM记录操作日志

10 提供管理接口,包括添加账户,用户额度,冻结账户等

11 用户认证装饰器 

简易流程图:https://www.processon.com/view/link/589eb841e4b0999184934329

示例代码: https://github.com/triaquae/py3_training/tree/master/atm

反正我这种小白是看不懂~!等以后再说吧,以后的以后~

这是尾巴~

这里推荐一个链接:。 https://mp.weixin.qq.com/s/ey7kR34xbDJR9E1ypEkMHQ

这是十七个学习网站,值得你去浪费时光~点击这里

D03——C语言基础学习PYTHON的更多相关文章

  1. D17——C语言基础学PYTHON

    C语言基础学习PYTHON——基础学习D17 20181014内容纲要: 1.jQuery介绍 2.jQuery功能介绍 (1)jQuery的引入方式 (2)选择器 (3)筛选 (4)文本操作 (5) ...

  2. D16——C语言基础学PYTHON

    C语言基础学习PYTHON——基础学习D16 20180927内容纲要: 1.JavaScript介绍 2.JavaScript功能介绍 3.JavaScript变量 4.Dom操作 a.获取标签 b ...

  3. D15——C语言基础学PYTHON

    C语言基础学习PYTHON——基础学习D15 20180926内容纲要: 1.CSS介绍 2.CSS的四种引入方式 3.CSS选择器 4.CSS常用属性 5.小结 6.练习 1 CSS介绍 层叠样式表 ...

  4. D14——C语言基础学PYTHON

    C语言基础学习PYTHON——基础学习D14 20180919内容纲要: 1.html认识 2.常用标签 3.京东html 4.小结 5.练习(简易淘宝html) 1.html初识(HyperText ...

  5. D13——C语言基础学PYTHON

    C语言基础学习PYTHON——基础学习D13 20180918内容纲要: 堡垒机运维开发 1.堡垒机的介绍 2.堡垒机的架构 3.小结 4.堡垒机的功能实现需求 1 堡垒机的介绍 百度百科 随着信息安 ...

  6. D12——C语言基础学PYTHON

    C语言基础学习PYTHON——基础学习D12 20180912内容纲要: 1.数据库介绍 2.RDMS术语 3.MySQL数据库介绍和基本使用 4.MySQL数据类型 5.MySQL常用命令 6.外键 ...

  7. D11——C语言基础学PYTHON

    C语言基础学习PYTHON——基础学习D11 20180908内容纲要: 1.RabbitMQ消息队列 (1)RabbitMQ安装 (2)Rabbits示例 模式一:fanout 模式二:direct ...

  8. D10——C语言基础学PYTHON

    C语言基础学习PYTHON——基础学习D10 20180906内容纲要: 1.协程 (1)yield (2)greenlet (3)gevent (4)gevent实现单线程下socket多并发 2. ...

  9. D09——C语言基础学PYTHON

    C语言基础学习PYTHON——基础学习D09 20180903内容纲要: 线程.进程 1.paramiko 2.线程.进程初识 3.多线程 (1)线程的调用方式 (2)join (3)线程锁.递归锁. ...

随机推荐

  1. devexpress v14.2.3 发布

    补丁而已. New Major Features in 14.2 What's New in VCL Products 14.2 Breaking Changes To learn about bre ...

  2. 2018.09.11 loj#10216.五指山(exgcd)

    传送门 就是一个exgcd的板子. 但注意算距离差的时候是在一个环上面算. 还有,答案要开long long233... 注意这两点之后就是exgcd板子了. 代码: #include<bits ...

  3. 2018.09.09 bzoj3505: [Cqoi2014]数三角形(容斥原理+简单计数)

    传送门 正难则反. 可以直接把问题转化成求出三点共线的情况数量. 如果同在一排或一列显然可以直接算,关键是如何求出斜着的. 我们知道,对于一个整点矩形. 如果长为x,宽为y,那么这个矩形任意一条对角线 ...

  4. 2018.07.08 NOIP模拟 好数(线段树)

    好数 题目背景 SOURCE:NOIP2016-AHSDFZ T3 题目描述 我们定义一个非负整数是"好数",当且仅当它符合以下条件之一: 1. 这个数是 0 或 1 . 2. 所 ...

  5. Excel获得焦点变色

    1.  点击 Sheet 2. 右键菜单  查看代码 3. 复制如下代码 Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Ran ...

  6. GitBash入门

    转载自:http://www.cnblogs.com/randomsteps/p/5415116.html 作为一个初学者,我是跟着廖学峰老师的官方博客学习,这里只是做个笔记,哈哈,关于git的历史. ...

  7. 用Git将项目发布在GitHub里

    转载自http://blog.csdn.net/u011572517/article/details/50537407,个人加了一些注意事项和解释. githud是一个程序员以后成长都会使用到的,先不 ...

  8. Codeforces735C Tennis Championship 2016-12-13 12:06 77人阅读 评论(0) 收藏

    C. Tennis Championship time limit per test 2 seconds memory limit per test 256 megabytes input stand ...

  9. spring mvc + velocity 搭建实例程序maven版本并且使用的是tomcat容器而不是jetty(step by step)

    笔者最近在学习spring mvc 查了很多资料,但用jsp的居多,但项目中需要用velocity,所以说就学习了一下,现将所查资料以及搭建过程陈述如下,供需要的人参考 1.楼主用的是eclipse+ ...

  10. 对Spring 容器管理事务支持的总结

    1.问题 Connection conn = DataSourceUtils.getConnection(); //开启事务 conn.setAutoCommit(false); try { Obje ...