函数第一类方法、f-string格式化、迭代器及递归函数

函数第一类方法、f-string格式化、迭代器及递归函数

函数第一类方法

- 函数名可以赋值给其他变量

def func():
    print(1)
a = func
a()
# 结果:1

- 函数名可以当做容器类的元素

def func1():
    print(1)
def func2():
    print(2)
def func3():
    print(3)
for i in [func1,func2,func3]:
    i()
# 结果:
1
2
3

- 函数名可以当做函数的参数

def func():
    print(1)
def func1(f):
    print('我是传递过来的函数')
    f()
func1(func)
# 结果:
'我是传递过来的函数'
1

- 函数名可以作为函数的返回值

def func():
    def foo():
        a = 1
        print(a)
    return foo
ret = fun()
ret()
# 结果:
1

f-string字符串格式化

支持:F,变量,数字计算,表达式,函数,列表取值,字典取值

s = f"你好{'赛丽亚'}"       # 填充字符串
s1 = F"你好{'赛丽亚'}"
print(s)
print(s1)
# 结果:
你好赛丽亚
你好赛丽亚
s = '世界'
s1 = f"你还是挺好的{s}" # 填充变量
print(s1)
s1 = f"{35+15}"         # 填充计算公式
print(s1)
a = 10
b = 20
s1 = f"{a if a>b else b}"  # 填充表达式
print(s1)
def foo():
    def func():
        a = 1
        return a
    return func()
s1 = f"{foo()}"        # 填充函数
print(s1)
lst = [1,3,4,5,6]
s1 = f"{lst[0:5]}"      #填充列表
print(s1)  
dic = {"key1":123,"key2":345}
s1 = f"{dic['key2']}"     #填充字典
print(s1)
print(f"{{73}}")  # {73}
print(f"{{{73}}}")  # {73}
print(f"{{{{73}}}}")  # {{73}}
m = 21
# ! , : { } ;这些标点不能出现在{} 这里面。
# print(f'{;12}')  # 报错
# 所以使用lambda 表达式会出现一些问题。
# 解决方式:可将lambda嵌套在圆括号里面解决此问题。
x = 5
print(f'{(lambda x: x*2) (x)}')  # 10

迭代器

可迭代对象

在python中,但凡内部含有iter方法的对象,都是可迭代对象

a = 'alex'
print(dir(a))
# 结果:
['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'capitalize', 'casefold', 'center', 'count', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'format_map', 'index', 'isalnum', 'isalpha', 'isdecimal', 'isdigit', 'isidentifier', 'islower', 'isnumeric', 'isprintable', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'maketrans', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']

简单的方法:

a = 'alex'
print('__iter__' in dir(a))
# 结果:
True

我们平时用到的list 、str、tuple、dict、set都是可迭代对象

可迭代对象的优点:

  • 方便取值,比较直观
  • 占用内存

迭代器

迭代器的定义:

从字面意思来看,迭代器就是可以迭代取值的工具。

从专业角度来说:迭代器是这样的对象:实现了无参数的__next__方法,返回序列中的下一个元素,如果没有元素了,那么抛出StopIteration异常.python中的迭代器还实现了__iter__方法,因此迭代器也可以迭代。

我们常见数据类型list、str、dict、tuple、set及文件句柄,只有文件句柄是迭代器

o1 = 'alex'
o2 = [1, 2, 3]
o3 = (1, 2, 3)
o4 = {'name': '李白','age': 18}
o5 = {1, 2, 3}
f = open('file',encoding='utf-8', mode='w')
print('__iter__' in dir(o1))  # True
print('__iter__' in dir(o2))  # True
print('__iter__' in dir(o3))  # True
print('__iter__' in dir(o4))  # True
print('__iter__' in dir(o5))  # True
print('__iter__' in dir(f))  # True

print('__next__' in dir(o1))  # False
print('__next__' in dir(o2))  # False
print('__next__' in dir(o3))  # False
print('__next__' in dir(o4))  # False
print('__next__' in dir(o5))  # False
print('__next__' in dir(f))  # True
f.close()

迭代对象转化为迭代器:

lst = list(range(6))
lst1 = lst.__iter__()
print(lst1)
# 结果:<list_iterator object at 0x000001C68FCA87B8>

lst = list(range(6))
lst1 = iter(lst)
print(lst1)
# 结果:<list_iterator object at 0x00000211B7048780>

**迭代器取值(使用__next__方法):**

lst = list(range(3))
lst1 = lst.__iter__()
ret = lst1.__next__()
print(ret)    # 0
ret = lst1.__next__()
print(ret)    # 1
ret = lst1.__next__()
print(ret)    # 2
ret = lst1.__next__()
print(ret)    # StopIteration
# 迭代器利用next取值:一个next取对应的一个值,如果迭代器里面的值取完了,还要next,那么就报StopIteration的错误。

while模拟for的内部循环机制:

lst = list(range(5))
count = len(lst)
lst_s = lst.__iter__()
while count:
    print(lst_s.__next__())
    count -= 1
# 郭氏原理
lst = list(range(5))
lst_s = lst.__iter__()
while True:
    try:
        print(lst_s.__next__())
    except StopIteration:
        print('迭代终止')

递归函数

有效递归的两个条件:

  • 不断的调用自己本身
  • 有明确的终止条件
def age(n):
    if n == 1:
        return 18
    else:
        return age(n-1)+2
print(age(3))

原文地址:https://www.cnblogs.com/lifangzheng/p/11209405.html

时间: 2024-10-23 16:26:20

函数第一类方法、f-string格式化、迭代器及递归函数的相关文章

Python基础教程(第九章 魔法方法、属性和迭代器)

本文内容全部出自<Python基础教程>第二版,在此分享自己的学习之路. ______欢迎转载:http://www.cnblogs.com/Marlowes/p/5437223.html______ Created on Marlowes 在Python中,有的名称会在前面和后面都加上两个下划线,这种写法很特别.前面几章中已经出现过一些这样的名称(如__future__),这种拼写表示名字有特殊含义,所以绝不要在自己的程序中使用这样的名字.在Python中,由这些名字组成的集合所包含的方法称

&lt;&lt;Python基础教程&gt;&gt;学习笔记 | 第09章 | 魔法方法、属性和迭代器

这一章,有点抽象,看着有点蛋疼! 双下划线__future__或单下划线有特殊含义,在Python中,这些名字的集合称为魔法方法:最重要的是__init__和一些处理访问对象的方法,这些方法允许你创建自己的序列或者是映射. ------ 准备工作: 将__metaclass__=type放在模块的最开始位置,以确保类时最新式的.考虑下面两个类 class NewStyle(object): more_code_here class OldStyle: more_code_here 如果文件以__

strdup函数的使用方法

函数名: strdup 功  能: 将串复制到新建的位置处 用  法: char *strdup(char *str): 这个函数在linux的man手冊里解释为: The strdup() function returns a pointer toa new string which is a duplicate of the string s. Memory for thenew string is obtained with malloc(3), and can be freed with

python之特殊方法、属性和迭代器

9.1 准备工作 class NewStyle(object) more_code_here class OldStyle: more_code_here 在这两个类中,NewStyle是新式的类,OldStyle是旧式的类.如果文件以__metaclass__=type开始,那么两个类都是新式类. 除此之外,还可以在自己的类的作用域中对__metaclass__变量赋值.这样只会为这个类设定元类.元类是其他类的类-----这是个更高级的主题. 9.2 构造方法 当一个对象被创建后,会立即调用构

编译器架构的王者LLVM——(7)函数的翻译方法

LLVM平台,短短几年间,改变了众多编程语言的走向,也催生了一大批具有特色的编程语言的出现,不愧为编译器架构的王者,也荣获2012年ACM软件系统奖 -- 题记 版权声明:本文为 西风逍遥游 原创文章,转载请注明出处 西风世界 http://blog.csdn.net/xfxyy_sxfancy 函数的翻译方法 前面介绍了许多编译器架构上面的特点,如何组织语法树.如果多遍扫描语法树.今天开始,我们就要设计本编译器中最核心的部分了,如何设计一个编译时宏,再利用LLVM按顺序生成模块. 设计宏 我们

《Python基础教程(第二版)》学习笔记 -&gt; 第九章 魔法方法、属性和迭代器

准备工作 >>> class NewStyle(object): more_code_here >>> class OldStyle: more_code_here 在这两个类中,NewStyle是新式的类,OldStyle是旧式的类,如果文件以__metaclass__ = type 开始,那么两个类都是新式类. 构造方法 构造方法,当一个对象被创建后,会立即调用构造方法.Python中创建一个构造方法,只要把init方法的名字从简单的init修改成__init__

String格式化参数整理

Java String格式话参数整理如下: conversion:转换格式,可选的格式有: d 整数型(十进制) c Unicode字符 b Boolean值 s String f 浮点数(十进制) e 浮点数(科学计数) x 整数(十六进制) h 散列码 % 字符串“%” C++ String格式化参数整理如下: 1.转换说明符 %a(%A) 浮点数.十六进制数字和p-(P-)记数法(C99) %c 字符 %d 有符号十进制整数 %f 浮点数(包括float和doulbe) %e(%E) 浮点

c++虚函数的使用方法

虚函数的使用方法: (1)在基类用virtual声明成员函数为虚函数.这样就可以在派生类中重新定义此函数,为它赋予新的功能,并能方便被调用. 在类外定义虚函数时,不必在定义virtual (2)在派生类中重新定义此函数,要求函数名,函数类型,函数参数个数和类型全部与基类的虚函数相同,并根据派 生类的需要重新定义函数体. c++规定,当一个成员函数被声明为虚函数后,其派生类的同名函数都自动成为虚函数.因此在派生类重新声明该 虚函数时,可以加virtual,也可以不加,但习惯上一般在每层声明该函数时

迭代器就是重复地做一些事情,可以简单的理解为循环,在python中实现了__iter__方法的对象是可迭代的,实现了next()方法的对象是迭代器,这样说起来有

迭代器就是重复地做一些事情,可以简单的理解为循环,在python中实现了__iter__方法的对象是可迭代的,实现了next()方法的对象是迭代器,这样说起来有点拗口,实际上要想让一个迭代器工作,至少要实现__iter__方法和next方法.很多时候使用迭代器完成的工作使用列表也可以完成,但是如果有很多值列表就会占用太多的内存,而且使用迭代器也让我们的程序更加通用.优雅.pythonic.下边是一个例子,从里边你会感受到不用列表而用迭代器的原因. #!/usr/bin/env python #c