zoukankan      html  css  js  c++  java
  • python 16day--函数作用域与函数式编程

    一、函数作用域:

     1 #1、作用域即范围
     2         - 全局范围(内置名称空间与全局名称空间属于该范围):全局存活,全局有效
     3       - 局部范围(局部名称空间属于该范围):临时存活,局部有效
     4 #2、作用域关系是在函数定义阶段就已经固定的,与函数的调用位置无关,如下
     5 x=1
     6 def f1():
     7     def f2():
     8         print(x)
     9     return f2
    10 x=100
    11 def f3(func):
    12     x=2
    13     func()
    14 x=10000
    15 f3(f1())
    16 
    17 #3、查看作用域:globals(),locals()
    18 
    19 
    20 LEGB 代表名字查找顺序: locals -> enclosing function -> globals -> __builtins__
    21 locals 是函数内的名字空间,包括局部变量和形参
    22 enclosing 外部嵌套函数的名字空间(闭包中常见)
    23 globals 全局变量,函数定义所在模块的名字空间
    24 builtins 内置模块的名字空间

    二、函数式编程:

     1 #1、首先强调:面向过程编程绝对不是用函数编程这么简单,面向过程是一种编程思路、思想,而编程思路是不依赖于具体的语言或语法的。言外之意是即使我们不依赖于函数,也可以基于面向过程的思想编写程序
     2 
     3 #2、定义
     4 面向过程的核心是过程二字,过程指的是解决问题的步骤,即先干什么再干什么
     5 
     6 基于面向过程设计程序就好比在设计一条流水线,是一种机械式的思维方式
     7 
     8 #3、优点:复杂的问题流程化,进而简单化
     9 
    10 #4、缺点:可扩展性差,修改流水线的任意一个阶段,都会牵一发而动全身
    11 
    12 #5、应用:扩展性要求不高的场景,典型案例如linux内核,git,httpd
    13 
    14 #6、举例
    15 流水线1:
    16 用户输入用户名、密码--->用户验证--->欢迎界面
    17 
    18 流水线2:
    19 用户输入sql--->sql解析--->执行功能

    ps:函数的参数传入,是函数吃进去的食物,而函数return的返回值,是函数拉出来的结果,面向过程的思路就是,把程序的执行当做一串首尾相连的功能,该功能可以是函数的形式,然后一个函数吃,拉出的东西给另外一个函数吃,另外一个函数吃了再继续拉给下一个函数吃。。。

    三、函数式编程举例:

     1 #=============复杂的问题变得简单
     2 #注册功能:
     3 #阶段1: 接收用户输入账号与密码,完成合法性校验
     4 def talk():
     5     while True:
     6         username=input('请输入你的用户名: ').strip()
     7         if username.isalpha():
     8             break
     9         else:
    10             print('用户必须为字母')
    11 
    12     while True:
    13         password1=input('请输入你的密码: ').strip()
    14         password2=input('请再次输入你的密码: ').strip()
    15         if password1 == password2:
    16             break
    17         else:
    18             print('两次输入的密码不一致')
    19 
    20     return username,password1
    21 
    22 #阶段2: 将账号密码拼成固定的格式
    23 def register_interface(username,password):
    24     format_str='%s:%s
    ' %(username,password)
    25     return format_str
    26 
    27 #阶段3: 将拼好的格式写入文件
    28 def handle_file(format_str,filepath):
    29     with open(r'%s' %filepath,'at',encoding='utf-8') as f:
    30         f.write(format_str)
    31 
    32 
    33 def register():
    34     user,pwd=talk()
    35     format_str=register_interface(user,pwd)
    36     handle_file(format_str,'user.txt')
    37 
    38 
    39 register()
    40 
    41 
    42 #=============牵一发而动全身,扩展功能麻烦
    43 #阶段1: 接收用户输入账号与密码,完成合法性校验
    44 def talk():
    45     while True:
    46         username=input('请输入你的用户名: ').strip()
    47         if username.isalpha():
    48             break
    49         else:
    50             print('用户必须为字母')
    51 
    52     while True:
    53         password1=input('请输入你的密码: ').strip()
    54         password2=input('请再次输入你的密码: ').strip()
    55         if password1 == password2:
    56             break
    57         else:
    58             print('两次输入的密码不一致')
    59 
    60 
    61     role_dic={
    62         '1':'user',
    63         '2':'admin'
    64     }
    65     while True:
    66         for k in role_dic:
    67             print(k,role_dic[k])
    68 
    69         choice=input('请输入您的身份>>: ').strip()
    70         if choice not in role_dic:
    71             print('输入的身份不存在')
    72             continue
    73         role=role_dic[choice]
    74 
    75     return username,password1,role
    76 
    77 #阶段2: 将账号密码拼成固定的格式
    78 def register_interface(username,password,role):
    79     format_str='%s:%s:%s
    ' %(username,password,role)
    80     return format_str
    81 
    82 #阶段3: 将拼好的格式写入文件
    83 def handle_file(format_str,filepath):
    84     with open(r'%s' %filepath,'at',encoding='utf-8') as f:
    85         f.write(format_str)
    86 
    87 
    88 def register():
    89     user,pwd,role=talk()
    90     format_str=register_interface(user,pwd,role)
    91     handle_file(format_str,'user.txt')
    92 
    93 
    94 register()
    95 
    96 
    97 #ps:talk内对用户名密码角色的合法性校验也可以摘出来做成单独的功能,但本例就写到一个函数内了,力求用更少的逻辑来为大家说明过程式编程的思路
    98 
    99 示例:复杂的问题变得简单,但扩展功能麻烦
  • 相关阅读:
    游戏开发之路小结(二):关于第一人称射击游戏开发实战小结
    游戏开发之路小结(一):关于太空射击游戏开发实战小结
    游戏开发要涉及的几个方面
    短短几行代码实现让摄像机跟随着物体效果
    关于移动设备几种屏幕输入方式的小结
    软件的体系架构摘要
    jQuery入门笔记之(一)选择器引擎-【转】
    ASCII码对照表
    将数字转出大写如:100转换后结果为一佰
    google搜索技巧总结
  • 原文地址:https://www.cnblogs.com/yuzhiboyou/p/10135288.html
Copyright © 2011-2022 走看看