zoukankan      html  css  js  c++  java
  • D03——C语言基础学习PYTHON

    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:语法

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

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

     1 #函数
     2 def func2():
     3     '''the function definitions'''
     4     print('in the func2')
     5     return 0
     6 #过程
     7 def func3():
     8     '''the function definitions'''
     9     print('in the func3')
    10 
    11 x=func2()
    12 y=func3()
    13 print('from func2 return is %s'%x)
    14 print('from func3 return is %s'%y)
    要不要看一眼

    2 函数的参数

      a 形参实参

      b 默认参数

      c 关键字参数

      d 非固定参数

     a 形参实参

    1 #Author:ZhangKanghui
    2 
    3 def multi(x,y):         #x,y形参
    4     res =x**y
    5     return res
    6 a =multi(3,4)           #3,4实参
    7 print(a)
    这个很容易理解

    b 默认参数

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

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

    c 关键字参数

    1 def info(name,age,country="China"):
    2     print ("————info————")
    3     print ("姓名:",name)
    4     print ("年龄:",age)
    5     print("国籍:",country)
    6 
    7 info(age=23,name='Zhangkanghui')
    8 info(age=23,name='Zhangkanghui',country='CN')
    也能感受到默认参数

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

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

    d 非固定参数

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

    • *args会把传入的参数组成一个元组
    • *kwargs会把传入的参数组成一个字典
     1 def info(name,age,*args): # *args 会把多传入的参数变成一个元组形式
     2     print(name,age,args)
     3  
     4 info("Kanghui",22)
     5 #输出
     6 #Kanghui 22 () #后面这个()就是args,只是因为没传值,所以为空
     7  
     8 info("Jack",32,"CN","Python")
     9 #输出
    10 # Jack 32 ('CN', 'Python')
    *args
     1 def info(name,age,*args,**kwargs): # *kwargs 会把多传入的参数变成一个dict形式
     2     print(name,age,args,kwargs)
     3  
     4 info("Kanghui",22)
     5 #输出
     6 #Kanghui 22 () {}#后面这个{}就是kwargs,只是因为没传值,所以为空
     7  
     8 info("Jack",32,"CN","Python",sex="Male",province="ShanDong")
     9 #输出
    10 # Jack 32 ('CN', 'Python') {'province': 'ShanDong', 'sex': 'Male'}
    *kwargs

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

    全局变量和局部变量

    作用域不同:

    全局变量作用域是整个程序,局部变量作用域是定义该变量的子程序。
    当全局变量与局部变量同名时:在定义局部变量的子程序内,局部变量起作用;在其它地方全局变量起作用。
     1 #Author:ZhangKanghui
     2 
     3 name = "Kanghui"
     4 
     5 def change_name(name):
     6     print("before change:", name)
     7     name = "kanghui"
     8     print("after change", name)
     9 change_name(name)
    10 print("在外面看看name改了么?", name)
    看完代码你就明白了
     1 #Author:ZhangKanghui
     2 #全局变量与局部变量的访问顺序
     3 x=0
     4 def gandpa():
     5     x=1
     6     def dad():
     7         x=2
     8         def son():
     9             x=3
    10             print(x)
    11         son()
    12     dad()
    13 gandpa()
    关于局部变量和全局变量的访问顺序

    4 函数的返回值

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

    返回值有什么用?

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

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

    5 递归函数

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

    1 #其实我觉得就是类似于迭代
    2 def calc(n):
    3     print(n)
    4     if int(n/2)==0:
    5         return n
    6     return calc(int(n/2))
    7 calc(10)
    递归是怎么回事呢?

    递归特性:

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

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

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

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

    6 高阶函数

    一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数。下一节会有更详细的讲解和应用。配合嵌套函数完成生成器的功能。

    1 #函数的变量参数还是个函数
    2 def add(x,y,f):
    3     return f(x)+f(y)
    4 
    5 a =add(3,-6,abs)
    6 print(a)
    高阶函数

    7 匿名函数

    不需要显实的定义函数。

    1 calc =lambda x:x*3
    2 print(calc(3))

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

    1 calc2 =lambda m: 3 if m<4 else m
    2 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)
    关于匿名函数的一些其他用法
    1 import functools
    2 res3 =functools.reduce(lambda x,y:x+y,range(10))            #累加
    3 print(res3)
    4 
    5 res4 =functools.reduce(lambda x,y:x*y,range(1,9))           #阶乘
    实现累加和阶乘
    8 函数式编程
    函数是Python内建支持的一种封装,我们通过把大段代码拆成函数,通过一层一层的函数调用,就可以把复杂任务分解成简单的任务,这种分解可以称之为面向过程的程序设计。
    函数就是面向过程的程序设计的基本单元。

    举例来说:如果有一个数学表达式是这样的:
    1 (1+2)*3-4

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

    1 var a =1+2
    2 var b =a*3
    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

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

    坚持到无能为力,拼搏到感动自己!
  • 相关阅读:
    打印沙漏
    秋季学期学习总结
    反射
    线程(二)join、yeild、同步(synchronized:同步块,同步方法;,Lock)、非线程安全单例模式、线程安全单例模式、多线程售卖电影票处理、通过线程依次打印A、B、C、wait和sleep
    线程(一)
    红包计算的方法(通过2倍指数法进行计算,通过线性切割法计算)
    Math常用类、Date类、Calendar类、两者相互转换
    Java包(访问修饰符的范围)、String字符串、StringBuilder类、基本类型和引用类型
    编写一个系统(登录、注册、验证用户名密码和验证码、覆盖存储用户)
    递归的使用:调用方法自身
  • 原文地址:https://www.cnblogs.com/zhangkanghui/p/9418654.html
Copyright © 2011-2022 走看看