python — 函数基础知识(二)

目录

  • 1 返回值
  • 2 作用域
  • 3 函数小高级
  • 4 函数中高级

1 返回值

def func(arg):
    # ....
    return 9 # 返回值为9 默认:return None

val = func('adsfadsf')
# 1. 让用户输入一段字符串,计算字符串中有多少A字符的个数。有多少个就在文件a.txt中写多少个“李邵奇”。

def get_char_count(data):
    sum_counter = 0
    for i in data:
        if i == 'A':
            sum_counter += 1

    return sum_counter

def write_file(line):
    if len(line) == 0:
        return False  # 函数执行过程中,一旦遇到return,则停止函数的执行。
    with open('a.txt',mode='w',encoding='utf-8') as f:
        f.write(line)
    return True 

content = input('请输入:')
counter = get_char_count(content)
write_data = "李邵奇" * counter
status = write_file(write_data)
if status:
    print('写入成功')
else:
    print('写入失败')

函数没有返回值时,默认返回None。

函数内部执行过程中遇到return就终止。

def func1():
    return "完成" # 函数每次执行到此,就返回;所以下面代码永远不执行。
    for i in range(10):
        print(i)
func1()               

def func2():
    for i in range(10):
        print(i)
        return "完成"
    print(666)
func2()        # 只打印0

return可以返回任意值

特殊情况:return返回多个值时,返回的是元组,与返回值是元组时是一样的

def func():
    return (1,2,3)

v = func()
print(v)

# 特殊:返回元组
def func():
    return 5,8,"alex"

v = func()
print(v)

return的作用:a. 返回值 b.终止函数的执行

练习题

# 1. 写函数,计算一个列表中有多少个数字,打印: 列表中有%s个数字。
#    提示:type('x') == int 判断是否是数字。

# 方式一:
def get_list_counter1(data_list):
    count = 0
    for item in data_list:
        if type(item) == int:
            count += 1
    msg = "列表中有%s个数字" %(count,)
    print(msg)

get_list_counter1([1,22,3,'alex',8])

# 方式二:
def get_list_counter2(data_list):
    count = 0
    for item in data_list:
        if type(item) == int:
            count += 1
    return count

v = get_list_counter1([1,22,3,'alex',8])
msg = "列表中有%s个数字" %(v,)
print(msg)
# 2. 写函数,计算一个列表中偶数索引位置的数据构造成另外一个列表,并返回。
# 方式一:
def get_data_list1(arg):
    v = arg[::2]
    return v

data = get_data_list1([11,22,33,44,55,66])

# 方式二:
def get_data_list2(arg):
    v = []
    for i in range(0,len(arg)):
        if i % 2 == 0:
            v.append(arg[i])
    return v

data = get_data_list2([11,22,33,44,55,66])
# 3. 读取文件,将文件的内容构造成指定格式的数据,并返回。
"""
a.log文件
    alex|123|18
    eric|uiuf|19
    ...
目标结构:
a.  ["alex|123|18","eric|uiuf|19"] 并返回。
b. [['alex','123','18'],['eric','uiuf','19']]
c. [
    {'name':'alex','pwd':'123','age':'18'},
    {'name':'eric','pwd':'uiuf','age':'19'},
]
"""

with open('a.log.txt',mode = 'r',encoding = 'utf-8') as f:
    data = f.read()
    print(data)
    def get_file(a):
        date1 = []
        for i in a.split('\n'):
            date1.append(i)
        return date1
    v1 = get_file(data)
    print(v1)

    def get_file1(b):
        date2 = []
        d = []
        for i1 in b.split('\n'):
            i1 = i1.split('|')
            d.append(i1)
            date2 += d
        return date2
    v2 = get_file1(data)
    print(v2)

    def get_file2(c):
        date3 = []
        e = {}
        for i2 in c.split('\n'):
            i2 = i2.split('|')
            e['name'] = i2[0]
            e['pwd'] = i2[1]
            e['age'] = i2[2]
            date3.append(e)
        return date3
    v3 = get_file2(data)
    print(v3)
  1. 数据类型中的方法到底有没有返回值:
  • 无返回值

    v = [1,2,3,4]
    v.append(55)   # 无返回值时不用写return了

    list : append / insert / remove / clear / extend / reverse

    dict : update

    set : add / discard / update

  • 仅有返回值
    v = 'ddff2dd554cvc'
    result = '-'.join(v)
    return result
    
    v = {'k1':12,'k2':'ased'}
    result = v.get('k2')
    result = v.keys()

    str : upper / lower / replace / isdecimal / strip / split / startswith / endswith / encode / format / join

    list : find / index

    dict : keys / values / items / get

    set : intersection / union / difference / symmitric_difference

  • 有返回值 + 修改数据

    pop

    v = [11,22,33,44]
    result = v.pop(22)
    
  • 常用需要记住的

    索引、切片都有返回值

    str : split 返回列表

      strip     返回字符串
    
      replace    返回字符串
    
      join      返回字符串

    list : append 无

       insert        无
    
       remove     无
    
       pop          返回要删除的数据
    
       find          返回索引的位置
    
       index       返回索引的位置

    dict : keys 获取所有的键

         values     获取所有的值
    
         items       获取所有的键值对
    
         get     索引存在:返回值 ,不存在:返回None

2 作用域

在python文件中:

  • py文件:全局作用域
  • 函数:局部作用域
    a = 1
    def s1():
        x1 = 666
        print(x1)
        print(a)
        print(b)
    
    b = 2
    print(a)
    s1()
    a = 88888
    def s2():
        print(a,b)
        s1()
    
    s2()
    
  • 每个作用域中的数据只有作用域自己可以调用,如果作用域中调用的数据没有,可以调用全局作用域的

    全局作用域只能调用全局的

    在全局作用域中的函数可以互相调用(调用已经存在的),但不可以直接调用作用域中的作用域

总结:

  • 1.一个函数就是一个作用域
  • 2.作用域中查找数据规则:优先在自己的作用域找数据,自己没有就去“父级”-->“父级”-->直到全局,全局没有就报错。 (作用域的嵌套)

    注意:父级作用域中的值到底是多少?

    x = 10
    def func():
        x = 9
        print(x)
    
    func()

    小练习

    # 示例一
    x = 10
    def func():
        x = 9
        print(x)
        def x1():
            x = 999
            print(x)
    func()
    
    # 示例二
    x = 10
    def func():
        x = 9
        print(x)
        def x1():
            x = 999
            print(x)
        x1()
    func()
    
    # 示例三
    x = 10
    def func():
        x = 9
        print(x)
        def x1():
            x = 999
            print(x)
        print(x)
        x1()
    func()
    
    # 示例四
    x = 10
    def func():
        x = 8
        print(x)
        def x1():
            x = 999
            print(x)
        x1()
        print(x)
    func()
    
    # 示例五
    x = 10
    def func():
        x = 8
        print(x)
        def x1():
            print(x)
        x1()
        print(x)
    func()
    
    # 示例六
    x = 10
    def func():
        x = 8
        print(x)
        def x1():
            print(x)
        x = 9
        x1()
        x = 10
        print(x)
    func()
    
    # 示例七
    x = 10
    def func():
        x = 8
        print(x)
        def x1():
            print(x)
        x1()
        x = 9
        x1()
        x = 10
        print(x)
    
    func()
  • 3.子作用域中只能只能找到父级中的值,默认无法重新为父级的变量进行赋值。
    • 不能进行赋值,只能对可变类型进行内部修改

      # #####################
      name = 'oldboy'
      def func():
          name = 'alex' # 在自己作用域再创建一个这样的值。
          print(name)
      func()
      print(name)
      
      # #####################
      name = [1,2,43]
      def func():
          name.append(999)
          print(name)
      func()
      print(name)
    • 如果非要对全局的变量进行赋值需要加global(强制赋值)
      #示例一
      name = "老男孩“
      def func():
          global name
          name = 'alex'
      func()
      print name
      
      # 示例二
      name = ["老男孩",'alex']
      def func():
          global name
          name = '我'
      func()
      print(name)
      
      # 示例三
      name = "老男孩"
      def func():
          name = 'alex'
          def inner():
              global name
              name = 999
          inner()
          print(name)
      func()
      print(name)
      
    • 对父级的变量赋值用nonlocal,先找到父级的变量再进行赋值 (强制赋值)
      name = "老男孩"
      def func():
          name = 'alex'
          def inner():
              nonlocal name # 找到上一级的name
              name = 999
          inner()
          print(name)
      func()
      print(name)

补充:全局变量必须全部要大写

USER_LIST = [11,22,3]

def func():
    name = 'asdf'
    USER_LIST.append(12)
    USER_LIST.append(name)

func()
print(USER_LIST)

3 函数小高级

    1. 函数名可以当作变量来使用

      def func():
          print(123)
      
      v1 = func  # func代表函数的地址
      
      func()
      v1()   # v1、func的函数地址相同,执行调用的函数也相同
      def func():
          print(123)
      
      func_list = [func, func, func]
      # func_list[0]()  a
      # func_list[1]()  b
      # func_list[2]()  c
      for item in func_list:   # a/b/c的简化形式
          v = item()
          print(v)
      def func():
          print(123)
      
      def bar():
          print(666)
      
      info = {'k1': func, 'k2': bar}
      
      info['k1']()           # 函数也可以作为字典的值(也可以做为键,但是没有意义)
      info['k2']()

      注意:函数是不可变的,可以做集合的元素,也可以作为字典的键 (但是做键没有太大意义)。

             集合中可以放多个重复的函数,但只执行一次。(因为集合的特性:不可重复的)

      混淆你

      def func():
          return 123
      
      func_list1 = [func,func,func]
      func_list2 = [func(),func(),func()]
      
      print(func_list1)     # 打印的是func的函数地址
      print(func_list2)     # 打印的是func执行完返回的值
      
      info = {
          'k1':func,     # 函数的地址
          'k2':func(),   # 函数执行完返回的值
      }
      
      print(info)
    2. 函数也可以当作参数来进行传递
      def func(arg):
          print(arg)
      
      func(1)
      func([1,2,3,4])
      
      def show():
          return 999
      func(show)      # 执行函数func,参数为show,show没有+(),表示show没有执行只是代表该函数的地址。
      def func(arg):
          v1 = arg()
          print(v1)
      
      def show():
          print(666)
      
      func(show)
      def func(arg):
          v1 = arg()
          print(v1)
      
      def show():
          print(666)
      
      result = func(show)
      print(result)

      多个函数的调用

      def func():
          print('花费查询')
      
      def bar():
          print('语音沟通')
      
      def base():
          print('xxx')
      
      def show():
          print('xxx')
      
      def test():
          print('xxx')
      
      info = {
          'f1': func,
          'f2': bar,
          'f3':base,
          'f4':show,
          'f5':test
      }
      choice = input('请选择要选择功能:')
      function_name = info.get(choice)
      if function_name:
          function_name()
      else:
          print('输入错误')

总结:函数当作一个变量:参数传值 / 当作元素嵌套到字典、列表中

4 函数中高级

4.1 函数可以做返回值

# 示例一
def func():
    print(123)

def bar():
    return func

v = bar()
v()

# 示例二
name = 'oldboy'
def func():
    print(name)

def bar():
    return func

v = bar()
v()

# 示例三
def bar():
    def inner():
        print(123)
    return inner
v = bar()
v()

# 示例四
name = 'oldboy'
def bar():
    name = 'alex'
    def inner():
        print(name)
    return inner
v = bar()
v()

# 示例五
name = 'oldboy'
def bar(name):
    def inner():
        print(name)
    return inner
v1 = bar('alex') # { name=alex, inner }  # 闭包,为函数创建一块区域(内部变量供自己使用,存储的代码),为他以后执行提供数据。
v2 = bar('eric') # { name=eric, inner }
v1()
v2()

# 示例六
name = 'alex'
def base():
    print(name)

def func():
    name = 'eric'
    base()

func() # {name=eric, }

# 示例七
name = 'alex'
def func():
    name = 'eric'
    def base():
        print(name)
    base()
func()

# 示例八
name = 'alex'
def func():
    name = 'eric'
    def base():
        print(name)
    return base
base = func()
base()

注意:函数在何时被谁创建?

      函数是由谁创建的,执行函数就从哪里开始找
# 练习题一
info = []

def func():
    print(item)

for item in range(10):
    info.append(func)

info[0]()

# 练习题二
info = []

def func(i):
    def inner():
        print(i)
    return inner

for item in range(10):
    info.append(func(item))

info[0]()
info[1]()
info[4]()

4.2 闭包

def func(name):
    def inner():
        print(name)
    return inner 

v1 = func('alex')
v1()
v2 = func('eric')
v2()

返回值——分析函数执行的内存。(闭包是内存其中的一种)

# 并不是闭包
def func(name)
    def inner():
        return 123
    return inner
# 是闭包需要满足两个条件:1.封装值   2.内层函数需要使用
def func(name)
    def inner():
        print(name)
        return 123
    return inner

4.3 高阶函数

  • 把函数当作参数传递
  • 把函数当作返回值

    注意:对函数进行赋值

4.4 小总结

  • 1.函数执行流程的分析(函数到底是由谁创建的?)
  • 2.闭包概念:为函数创建一块区域并为其维护自己的数据以后执行时方便调用。(应用场景:装饰器 / SQLAlchemy源码)

原文地址:https://www.cnblogs.com/yangjie0906/p/11215799.html

时间: 2024-10-12 16:50:37

python — 函数基础知识(二)的相关文章

10分钟学会Python函数基础知识

看完本文大概需要8分钟,看完后,仔细看下代码,认真回一下,函数基本知识就OK了.最好还是把代码敲一下. 一.函数基础 简单地说,一个函数就是一组Python语句的组合,它们可以在程序中运行一次或多次运行.Python中的函数在其他语言中也叫做过程或子例程,那么这些被包装起来的语句通过一个函数名称来调用. 有了函数,我们可以在很大程度上减少复制及粘贴代码的次数了(相信很多人在刚开始时都有这样的体验).我们可以把相同的代码可以提炼出来做成一个函数,在需要的地方只需要调用即可.那么,这样就提高了代码的

10分钟学会 Python 函数基础知识

一.函数基础 简单地说,一个函数就是一组Python语句的组合,它们可以在程序中运行一次或多次运行.Python中的函数在其他语言中也叫做过程或子例程,那么这些被包装起来的语句通过一个函数名称来调用. 有了函数,我们可以在很大程度上减少复制及粘贴代码的次数了(相信很多人在刚开始时都有这样的体验).我们可以把相同的代码可以提炼出来做成一个函数,在需要的地方只需要调用即可.那么,这样就提高了代码的复用率了,整体代码看起来比较简练,没有那么臃肿了. 函数在Python中是最基本的程序结构,用来最大化地

教你快速学会 Python 函数基础知识

一.函数基础 简单地说,一个函数就是一组Python语句的组合,它们可以在程序中运行一次或多次运行.Python中的函数在其他语言中也叫做过程或子例程,那么这些被包装起来的语句通过一个函数名称来调用. 有了函数,我们可以在很大程度上减少复制及粘贴代码的次数了(相信很多人在刚开始时都有这样的体验).我们可以把相同的代码可以提炼出来做成一个函数,在需要的地方只需要调用即可.那么,这样就提高了代码的复用率了,整体代码看起来比较简练,没有那么臃肿了. 函数在Python中是最基本的程序结构,用来最大化地

python 函数基础知识整理

一.函数的定义: 定义:def 关键词开头,空格之后接函数名称和圆括号(),最后还有一个":". def 是固定的,不能变,必须是连续的def三个字母,不能分开... 空格 为了将def关键字和函数名分开 函数名:必须由字母下划线数字组成,不能是关键字,不能是数字开头,函数名还是要有一定的意义能够简单说明函数的功能 括号:是必须加的 注释:每一个函数都应该对功能和参数进行相应的说明,应该写在函数下面第一行.以增强代码的可读性. 调用:就是 函数名() 要记得加上括号 def 函数名(参

python — 函数基础知识(一)

目录 1 面向过程编程与函数式编程 2 函数的基本结构 3 函数的参数 1 面向过程编程与函数式编程 截至目前我们所接触.所写的编程为:面向过程式编程[可读性差/可重用性差] # 面向过程编程 user_input = input('请输入角色:') if user_input == '管理员': import smtplib from email.mime.text import MIMEText from email.utils import formataddr msg = MIMETex

Python入门基础知识实例,值得收藏!

7月的编程语言指数榜已经发布,Python 在今年5月首次超越 Java 拿下榜首位置后,仍保持上涨趋势,正逐渐与 Java 拉开差距.(图为与去年 7 月数据对比) 上周为大家简单介绍了如何安装Python和配置环境?相信大家都将Python安装成功了吧~今天小白就为大家分享一些Python的基础知识,希望大家都能快速入门Python~ 1.在Python 语言中,对象是通过引用传递的. 在赋值时,不管这个对象是新创建的,还是一个已经存在的,都是将该对象的引用(并不是值)赋值给变量. 如:x=

ASP.NET Core 2.2 基础知识(二) 中间件

原文:ASP.NET Core 2.2 基础知识(二) 中间件 中间件是一种装配到应用管道以处理请求和相应的软件.每个软件都可以: 1.选择是否将请求传递到管道中的下一个组件; 2.可在调用管道中的下一个组件前后执行工作. 管道由 IApplicationBuilder 创建: 每个委托都可以在下一个委托前后执行操作,.此外,委托还可以决定不将请求传递给下一个委托,这就是对请求管道进行短路.通常需要短路,是因为这样可以避免不必要的工作.比如: 1.静态文件中间件可以返回静态文件请求并使管道的其余

VII python(1)基础知识

VII Python(1)基础知识 1989年诞生(同LinuxOS),google推崇,06年后才开始在中国流行,08年运维开始使用python www.python.org(主流OS默认配的python为2.6或2.7,最好在Ubuntu12.10上使用python,对于开发很方便,否则会浪费很多时间在装某一软件包) https://www.python.org/ftp/python/ Python(简单.容易上手.语法非常简明,任何功能都可实现:胶水语言,粘合剂,能与任何语言结合起来(如j

Python 面向对象基础知识

面向对象基础知识 1.什么是面向对象编程? - 以前使用函数 - 类 + 对象 2.什么是类什么是对象,又有什么关系? class 类: def 函数1(): pass def 函数2(): pass # obj是对象,实例化的过程 obj = 类() obj.函数1() ========== 面向对象不好 ============ ========== 函数编程好 ============== - 有时候,函数编程能实现?比较麻烦. - 面向对象非常的简单就能实现. 3.什么时候适用面向对象?