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源码)

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

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

    看完本文大概需要8分钟,看完后,仔细看下代码,认真回一下,函数基本知识就OK了.最好还是把代码敲一下. 一.函数基础 简单地说,一个函数就是一组Python语句的组合,它们可以在程序中运行一次或多次运 ...

  2. python 函数基础知识整理

    一.函数的定义: 定义:def 关键词开头,空格之后接函数名称和圆括号(),最后还有一个":". def 是固定的,不能变,必须是连续的def三个字母,不能分开... 空格 为了将 ...

  3. python — 函数基础知识(一)

    目录 1 面向过程编程与函数式编程 2 函数的基本结构 3 函数的参数 1 面向过程编程与函数式编程 截至目前我们所接触.所写的编程为:面向过程式编程[可读性差/可重用性差] # 面向过程编程 use ...

  4. python函数-基础知识

    一.含义函数是程序内的“小程序” 二.示例 #!/usr/bin/env python #coding:utf-8 def hello(): print('Hello world!') print(' ...

  5. python 函数基础知识

    1.函数返回的多个值会被组织成元组被返回,也可以用多个值来接收 2.调用函数时候,传入的参数叫实际参数,简称实参,定义函数的参数叫做形式参数,简称形参-- 位置参数 def mymax(x,y): a ...

  6. python入门基础知识二(字符串的常用操作方法)

    下标/索引: a = "I'm interested in Python." print(a[4]) i # 英文的字符串每一个下标/索引对应一个字母(含标点) a = '我喜欢p ...

  7. python基础知识(二)

    python基础知识(二) 字符串格式化 ​ 格式: % 类型 ---- > ' %类型 ' %(数据) %s 字符串 ​ print(' %s is boy'%('tom')) ----> ...

  8. 菜鸟脱壳之脱壳的基础知识(二) ——DUMP的原理

    菜鸟脱壳之脱壳的基础知识(二)——DUMP的原理当外壳的执行完毕后,会跳到原来的程序的入口点,即Entry Point,也可以称作OEP!当一般加密强度不是很大的壳,会在壳的末尾有一个大的跨段,跳向O ...

  9. 《转》Python学习(17)-python函数基础部分

    http://www.cnblogs.com/BeginMan/p/3171977.html 一.什么是函数.方法.过程 推荐阅读:http://www.cnblogs.com/snandy/arch ...

随机推荐

  1. python的openpyxl的使用笔记

    openpyxl模块介绍 openpyxl模块是一个读写Excel 2010文档的Python库,如果要处理更早格式的Excel文档,需要用到额外的库,openpyxl是一个比较综合的工具,能够同时读 ...

  2. D. Restore Permutation(权值线段树)

    D. Restore Permutation time limit per test 2 seconds memory limit per test 256 megabytes input stand ...

  3. hive 调优(一)coding调优

    本人认为hive是很好的工具,目前支持mr,tez,spark执行引擎,有些大公司原来封装的sparksql,开发py脚本,但是目前hive支持spark引擎(不是很稳定,建议Tez先),所以离线还是 ...

  4. 使用Android手机作为树莓派的屏幕

    在使用树莓派时,有时出于应急,身边没有屏幕,或者外出携带时也不方便带着屏幕走.如果能使用随身携带的智能手机当做其屏幕,则会方便许多.看看效果,一个树莓派+充电宝+手机,就会非常有用了. 满足以下条件即 ...

  5. CentOS6.8安装Docker

    在CentOS6.8上安装Docker 1.Docker使用EPEL发布,RHEL系的OS首先要确保已经持有EPEL仓库,否则先检查OS的版本,然后安装相应的EOEL包:如下命令: yum insta ...

  6. 【转载】Maven安装配置+ GIt&SVN + Jenkins详细配置 软件项目管理 持续集成实验

    原文地址: https://www.cnblogs.com/clownice/p/5395933.html 以下是学习笔记: Jenkins是一款开源持续集成的软件,实现集成的自动化 自动构建工具:M ...

  7. centos7中oracle数据库安装和卸载

    参考: 完全命令行安装(验证可行):https://jingyan.baidu.com/article/90895e0f29c92164ec6b0bd1.html 存在疑问:是否需要jdk的配置(因为 ...

  8. Flutter移动电商实战 --(19)首页_火爆专区商品接口制作

    Dart中可选参数的设置 上节课在作通用方法的时候,我们的参数使用了一个必选参数,其实我们可以使用一个可选参数.Dart中的可选参数,直接使用“{}”(大括号)就可以了.可选参数在调用的时候必须使用p ...

  9. Python下划线命名模式

  10. error C2086: “int WINGDIAPI”: 重定义

    1>------ 已启动生成: 项目: OSG_3_1_osgViewer应用基础, 配置: Debug x64 ------1>cl : 命令行 warning D9002: 忽略未知选 ...