Python的return和yield,哪个是你的菜?
目录
1、return基础介绍 📚
1.1 return用途:数据返回
1.2 return执行:函数终止
1.3 return深入:无返回值情况
2、yield核心概念 🍇
2.1 yield与迭代器
2.2 生成器函数构建
2.3 yield的暂停与续行特性
3、return与yield对比 🔍
3.1 执行流程差异
3.2 数据处理方式
3.3 应用场景分析
4、实战:return在函数编程中的应用 🛠️
4.1 简单数据处理函数
4.2 复杂逻辑控制流
4.3 异常处理与返回值
5、实战:yield在高效迭代中的威力 💨
5.1 动态数据生成
5.2 大数据处理优化
5.3 与迭代协议结合实战
6、协程与async/await的yield角色 🔄
6.1 协程基础
6.2 async函数中的yield
6.3 异步IO与yield的高效协作
6.4 yield from的深层理解
7、性能与适用场景分析 📊
7.1 return在性能上的考量
7.2 yield对内存的友好度
7.3 如何选择:return还是yield
7.4 实战项目中的最佳实践
8、总结与展望 🌌
1、return基础介绍 📚
1.1 return用途:数据返回
在Python中,return
语句用于从函数中输出数据到调用者。当函数执行到return
时,它会立即停止执行当前函数并返回指定的值。如果未指定返回值 ,函数默认返回None
。例如,一个简单的函数用于计算两数之和并返回结果:
def add(a, b):result = a + breturn resultsum_result = add(3, 4)
print(sum_result) # 输出:7
1.2 return执行:函数终止
return
不仅用于传递数据 ,它的执行还意味着函数的终止。一旦遇到return
,不论函数内还有多少未执行的代码,都会直接结束执行并退出函数。例如:
def example():print("Before return")returnprint("This won't be printed") # 这行不会执行example() # 输出:Before return
1.3 return深入:无返回值情况
如果函数没有显式地包含return
语句 ,或者return
后面没有跟任何表达式,那么该函数默认返回None
。这在不需要函数产生具体输出 ,仅执行某些操作时很有用:
def print_hello():print("Hello, world!")result = print_hello()
print(result) # 输出:Hello, world! \n None
在此例中 ,尽管print_hello
函数打印了消息,但因为没有指定返回值,所以其实际返回None
。
2、yield核心概念 🍇
2.1 yield与迭代器
在Python中,yield
是一个强大的关键字 ,它允许一个函数在执行过程中保存状态,以便在后续调用中恢复执行。这种行为与传统的函数执行不同,后者在调用结束后清除所有局部变量。当一个函数包含了yield
关键字,它就变成了一个生成器函数,每次调用生成器的__next__()
方法时 ,函数从上次暂停的地方继续执行,直到遇到下一个yield
语句。下面是一个生成斐波那契数列的例子:
def fibonacci(n):a, b = 0, 1while a < n:yield aa, b = b, a + bfib = fibonacci(10)
for num in fib:print(num, end=' ') # 输出:0 1 1 2 3 5 8
2.2 生成器函数构建
生成器函数与普通函数的主要区别在于它使用yield
而非return
。这使得生成器能够记住函数的状态,而不是像普通函数那样在执行完毕后清除状态。生成器的这一特性使其非常适合处理大量数据或无限序列 ,因为它们只在需要时生成数据,从而节省内存。创建生成器函数后,通过调用它来获取生成器对象,然后可以使用next()
函数或迭代协议来访问生成的数据。
def count_up_to(max):count = 1while count <= max:yield countcount += 1counter = count_up_to(5)
for number in counter:print(number) # 输出:1 2 3 4 5
2.3 yield的暂停与续行特性
yield
语句使函数能够在执行过程中暂停,并在下次调用时从暂停点继续执行。这意味着,即使函数中有多个yield
语句 ,函数也不会从头开始执行 ,而是从上次暂停的yield
之后的代码行开始执行。这一特性使得生成器能够高效地处理数据流,因为它们不需要存储整个数据集在内存中 ,而是按需生成数据。
def number_generator():for i in range(3):yield iprint("After yield:", i)gen = number_generator()
print(next(gen)) # 输出:0
print("Outside generator") # 输出:Outside generator
print(next(gen)) # 输出:After yield: 0 \n 1
print(next(gen)) # 输出:After yield: 1 \n 2
在这个例子中,可以看到每当yield
语句执行后,函数会暂停并保存当前状态 ,随后可以继续从暂停处执行 ,展示yield
的暂停与续行特性。
3、return与yield对比 🔍
3.1 执行流程差异
return
关键字用于结束函数执行并返回一个值给调用者。一旦return
被执行,函数立刻终止,局部变量也会被清理。例如:
def simple_return(x):if x > 10:return "大于10"else:return "小于等于10"print(simple_return(15)) # 输出:"大于10"
而yield
则用于定义生成器函数 ,它允许函数暂停执行并在下一次迭代时从暂停点恢复,保留了函数的内部状态。例如:
def simple_yield():yield 1yield 2yield 3gen = simple_yield()
print(next(gen)) # 输出:1
print(next(gen)) # 输出:2
3.2 数据处理方式
return
通常用于一次性返回计算结果 ,适合于处理有限且确定数量的数据。例如 ,一个计算两个数字之和的函数会直接返回总和。
def sum_two_numbers(a, b):return a + bprint(sum_two_numbers(4, 5)) # 输出:9
相比之下,yield
支持按需生成数据,特别适用于处理大量数据或无限序列,如遍历文件行或生成斐波那契数列。
def fibonacci():a, b = 0, 1while True:yield aa, b = b, a + bfib_gen = fibonacci()
for _ in range(10):print(next(fib_gen), end=' ') # 输出:0 1 1 2 3 5 8 13 21 34
3.3 应用场景分析
-
• return常用于简单数据处理或计算任务 ,当函数需要一次性返回计算结果时。例如,数据验证、简单的转换逻辑或算法实现等。
-
• yield则在需要逐个访问元素的场景下大放异彩,特别是对于大数据处理、流式处理、或是实现迭代器和协程等高级编程模式。它能够显著提高程序的内存效率,特别适合处理数据量庞大的情境,如日志分析、实时数据流处理等。
通过上述对比 ,我们可以看到return
和yield
在数据处理和执行流程上的根本差异,以及它们各自适用的典型应用场景。正确选择它们,能够帮助开发者编写出更高效、更灵活的代码。
4、实战:return在函数编程中的应用 🛠️
4.1 简单数据处理函数
在日常开发中,return
最常见于简单的数据处理函数,如计算数值、转换数据类型或格式化字符串等。下面的例子展示了如何使用return
来实现一个简单的温度转换函数:
def celsius_to_fahrenheit(celsius):return celsius * 9 / 5 + 32fahrenheit = celsius_to_fahrenheit(30)
print(fahrenheit) # 输出:86.0
4.2 复杂逻辑控制流
当函数需要处理复杂的逻辑分支或循环结构时 ,return
同样扮演着关键角色。它能够帮助提前终止函数执行 ,避免不必要的计算 ,特别是在条件满足时立即返回结果。下面的例子展示了一个函数,该函数在数组中查找特定元素,找到后即刻返回其位置:
def find_element(arr, target):for index, value in enumerate(arr):if value == target:return indexreturn -1index = find_element([1, 2, 3, 4, 5], 3)
print(index) # 输出:2
4.3 异常处理与返回值
在处理潜在错误或异常情况时,return
也非常重要。它允许函数在检测到错误时立即返回一个错误码或异常信息 ,便于调用方处理。下面的示例展示了如何使用try-except
块结合return
来优雅地处理除零错误:
def safe_division(dividend, divisor):try:return dividend / divisorexcept ZeroDivisionError:return "Error: Division by zero"result = safe_division(10, 0)
print(result) # 输出:Error: Division by zero
通过上述实战案例,我们可以看到return
在不同场景下的运用方式,无论是基础的数据处理、复杂的逻辑控制还是异常处理,return
都提供了强大而灵活的功能 ,使得函数设计更加健壮和高效。
5、实战:yield在高效迭代中的威力 💨
5.1 动态数据生成
yield
使得生成器成为动态数据生成的强大工具,它能够按需生成数据项,特别适合处理无穷序列或内存敏感的场景。例如,下面的生成器函数可用来生成连续的自然数:
def infinite_sequence():num = 1while True:yield numnum += 1# 打印前5个自然数
for count, number in zip(range(1, 6), infinite_sequence()):print(count, number)
# 输出:1 1, 2 2, 3 3, 4 4, 5 5
5.2 大数据处理优化
在处理大量数据时,一次性加载所有数据可能会导致内存溢出。通过使用yield
,可以逐步处理数据,仅在需要时加载数据片段 ,极大降低了内存消耗。例如,假设我们要处理一个大型文件,每次读取一行:
def read_large_file(file_path):with open(file_path, 'r') as file:for line in file:yield line.strip()# 假设file.txt为待处理的大文件
for line in read_large_file('file.txt'):process(line) # 假定process为处理每一行数据的函数
5.3 与迭代协议结合实战
yield
配合迭代器协议,可以构建复杂的数据处理流程。迭代器协议要求对象实现__iter__
和__next__
方法,而生成器自动实现了这些方法。下面是一个结合生成器和列表推导的例子,展示如何高效筛选数据:
def filter_even(nums):for num in nums:if num % 2 == 0:yield numnumbers = [1, 2, 3, 4, 5, 6]
even_nums = (num for num in filter_even(numbers)) # 使用生成器表达式进一步封装
print(list(even_nums)) # 输出:[2, 4, 6]
通过上述实战应用,我们见识到了yield
在实现动态数据生成、优化大数据处理以及构建复杂迭代流程中的独特优势。它不仅提升了代码的效率和灵活性,也为处理大规模数据集提供了内存友好的解决方案。
6、协程与async/await的yield角色 🔄
6.1 协程基础
协程是一种比线程更轻量级的并发机制,它允许在一个进程中同时运行多个函数,通过asyncio
库在Python中实现。协程的核心概念是能够在执行过程中挂起和恢复,这种能力由yield
语句的后代await
关键字实现。在Python中,使用async def
定义的函数会生成一个协程对象,这个对象可以挂起并等待异步操作完成。虽然yield
本身不直接支持并发 ,但结合asyncio
库和协程的概念,可以实现异步生成器 ,从而在非阻塞环境中处理多个任务或数据流。
import asyncioasync def slow_operation(n):await asyncio.sleep(1)return n * nasync def produce_squares(numbers):for number in numbers:yield await slow_operation(number)async def main():squares = [s async for s in produce_squares(range(5))]print(squares)asyncio.run(main()) # 输出:[0, 1, 4, 9, 16]
6.2 async函数中的yield
在Python 3.5及更高版本中,yield
被await
取代用于异步操作。await
用于等待一个协程对象的完成,而async def
定义的函数会返回一个协程对象。下面是一个使用await
的简单示例,展示了如何在协程中等待另一个协程的完成:
import asyncioasync def my_coroutine():await asyncio.sleep(1) # 模拟耗时操作print("协程执行完毕")async def main():task = asyncio.create_task(my_coroutine())await taskasyncio.run(main())
# 输出:协程执行完毕
6.3 异步IO与yield的高效协作
在处理I/O密集型任务时,如网络请求、文件读写等,协程通过await
能够极大地提升效率。在等待I/O操作时,协程会挂起,让其他协程运行,从而充分利用CPU资源。例如,下面的代码展示了如何使用aiohttp
库异步下载多个网页:
import aiohttp
import asyncioasync def fetch(session, url):async with session.get(url) as response:return await response.text()async def main():urls = ['https://example.com', 'https://example.org']async with aiohttp.ClientSession() as session:tasks = [fetch(session, url) for url in urls]results = await asyncio.gather(*tasks)for result in results:print(len(result))asyncio.run(main())
通过上述示例 ,可以看出await
如何在异步I/O操作中发挥关键作用,实现非阻塞的高效数据处理。协程和async/await
语法使得编写高并发的网络应用变得既简单又直观。
6.4 yield from的深层理解
yield from
语法允许一个生成器将其部分或全部迭代委托给另一个可迭代对象,包括其他生成器。这简化了生成器间的嵌套调用和数据传递,提高了代码的可读性和维护性。
def chain(*iterables):for it in iterables:yield from itprint(list(chain([1, 2], ['a', 'b']))) # 输出:[1, 2, 'a', 'b']
7、性能与适用场景分析 📊
7.1 return在性能上的考量
return
语句在性能上通常对函数调用栈影响较小,因为它直接结束函数执行并返回结果。在不需要保留函数状态或处理大量数据流的场景中 ,return
因其简洁明了,成为首选。性能损耗主要体现在函数调用的开销,而非return
语句本身。
7.2 yield对内存的友好度
yield
在处理大数据集时表现出了极高的内存效率,因为它仅在需要时产生下一个值 ,而非一次性生成整个结果集合。这种“懒惰”计算模式大大减少了内存占用 ,特别适用于处理如文件读取、大规模数据流处理等场景。生成器在迭代过程中保持状态,仅当迭代发生时分配必要的内存。
7.3 如何选择:return还是yield
选择return
还是yield
取决于具体需求:
-
• 一次性计算:如果函数的任务是完成一个计算并立即返回结果 ,使用
return
。 -
• 数据流处理:处理大量数据或需要逐个产生数据项时,
yield
和生成器更为合适。 -
• 状态保留:需要在多次调用间保持函数状态时 ,
yield
能自然地暂停和恢复执行。 -
• 内存敏感场景:对内存使用敏感的应用,
yield
可以有效降低内存消耗。
7.4 实战项目中的最佳实践
-
• 文件读取:利用生成器逐行读取大文件,避免一次性加载整个文件到内存。
def read_large_file(file_path):with open(file_path, 'r') as file:for line in file:yield linefor line in read_large_file('large_file.txt'):process(line) # 对每一行进行处理
-
• 网络爬虫:分页抓取大量数据时,使用生成器控制请求和解析过程,避免内存溢出。
def page_crawler(start_url, max_pages):current_page = 1while current_page <= max_pages:url = f"{start_url}?page={current_page}"content = fetch(url) # 假设fetch函数获取网页内容yield parse_content(content) # 解析内容并返回current_page += 1
通过上述分析 ,我们了解到return
和yield
在不同场景下的性能特点和适用条件。选择合适的控制流机制,不仅能够提升程序效率,还能确保代码的可读性和可维护性。在实际项目中灵活运用这些知识,是优化应用程序的关键。
8、总结与展望 🌌
在Python编程实践中,return
与yield
作为函数执行路径上的重要机制 ,分别扮演了数据传递与迭代生成的关键角色。return
直接输出函数结果 ,终止执行;而yield
则构建了状态保留的生成器 ,适合流式处理与内存优化。面对不同的数据处理需求 ,恰当选取二者至关重要。未来,Python的异步编程与协程模型 ,通过async/await
深化了yield
的应用,预示着在高效I/O处理与并发编程领域持续演进,凸显了语言的灵活性与生态的前瞻性。
相关文章:
Python的return和yield,哪个是你的菜?
目录 1、return基础介绍 📚 1.1 return用途:数据返回 1.2 return执行:函数终止 1.3 return深入:无返回值情况 2、yield核心概念 🍇 2.1 yield与迭代器 2.2 生成器函数构建 2.3 yield的暂停与续行特性 3、retur…...
持续总结中!2024年面试必问 20 道分布式、微服务面试题(七)
上一篇地址:持续总结中!2024年面试必问 20 道分布式、微服务面试题(六)-CSDN博客 十三、请解释什么是服务网格(Service Mesh)? 服务网格(Service Mesh)是一种用于处理服…...
AJAX 跨域
这里写目录标题 同源策略JSONPJSONP 是怎么工作的JSONP 的使用原生JSONP实践CORS 同源策略 同源: 协议、域名、端口号 必须完全相同、 当然网页的URL和AJAX请求的目标资源的URL两者之间的协议、域名、端口号必须完全相同。 AJAX是默认遵循同源策略的,不…...
3 数据类型、运算符与表达式-3.1 C语言的数据类型和3.2 常量与变量
数据类型 基本类型 整型字符型实型(浮点型) 单精度型双精度型 枚举类型 构造类型 数组类型结构体类型共用体类型 指针类型空类型 #include <stdio.h> #include <string.h> #include <stdbool.h> // 包含布尔类型定义 // 常量和符号常量 #define PRICE 30//…...
NSSCTF-Web题目5
目录 [SWPUCTF 2021 新生赛]error 1、题目 2、知识点 3、思路 [LitCTF 2023]作业管理系统 1、题目 2、知识点 3、思路 [HUBUCTF 2022 新生赛]checkin 1、题目 2、知识点 3、思路 [SWPUCTF 2021 新生赛]error 1、题目 2、知识点 数据库注入、报错注入 3、思路 首先…...
cnvd_2015_07557-redis未授权访问rce漏洞复现-vulfocus复现
1.复现环境与工具 环境是在vulfocus上面 工具:GitHub - vulhub/redis-rogue-getshell: redis 4.x/5.x master/slave getshell module 参考攻击使用方式与原理:https://vulhub.org/#/environments/redis/4-unacc/ 2.复现 需要一个外网的服务器做&…...
免费,C++蓝桥杯等级考试真题--第7级(含答案解析和代码)
C蓝桥杯等级考试真题--第7级 答案:D 解析:步骤如下: 首先,--a 操作会使 a 的值减1,因此 a 变为 3。判断 a > b 即 3 > 3,此时表达式为假,因为 --a 后 a 并不大于 b。因此,程…...
python为什么要字符串格式化
Python2.6 开始,新增了一种格式化字符串的函数 str.format(),它增强了字符串格式化的功能。相对于老版的%格式方法,它有很多优点。 1.在%方法中%s只能替代字符串类型,而在format中不需要理会数据类型; 2.单个参数可以…...
go语言后端开发学习(三)——基于validator包实现接口校验
前言 在我们开发模块的时候,有一个问题是我们必须要去考虑的,它就是如何进行入参校验,在gin框架的博客中我就介绍过一些常见的参数校验,大家可以参考gin框架学习笔记(四) ——参数绑定与参数验证,而这个其实也不是能够完全应对我…...
系统架构设计师【补充知识】: 应用数学 (核心总结)
一、 图论之最小生成树 (1)定义: 在连通的带权图的所有生成树中,权值和最小的那棵生成树(包含图中所有顶点的树),称作最小生成树。 (2)针对问题: 带权图的最短路径问题。 (3)最小生成树的解法有普里姆(Prim)算法和克鲁斯卡尔(Kruskal)算法,我…...
【ArcGIS微课1000例】0118:一文讲清楚tif(geotiff)栅格数据格式
文章目录 一、Tiff概述二、GeoTiff概述1. ovr文件2. tfw文件3. xml文件4. dbf文件一、Tiff概述 TIFF(Tagged Image File Format)是一种常见的图像文件格式,它被广泛用于存储和传输各种类型的图像数据。下面是对TIFF格式数据的介绍: 图像存储:TIFF格式可以存储多通道的位…...
调用第三方API --------------Python篇
在项目开发过程中,可能需要调用第三方的一些API或者公司提供的数据接口来得到相应的数据或者实现对应的功能。 因此API的调用和数据接口的访问都是做数据分析的一个常用操作,如何快速实现API和数据接口的调用,网上一般提供很多语言版本&#…...
Web自动化测试-掌握selenium工具用法,使用WebDriver测试Chrome/FireFox网页(Java
目录 一、在Eclipse中构建Maven项目 1.全局配置Maven 2.配置JDK路径 3.创建Maven项目 4.引入selenium-java依赖 二、Chrome自动化脚本编写 1.创建一个ChromeTest类 2.测试ChromeDriver 3.下载chromedriver驱动 4.在脚本中通过System.setProperty方法指定chromedriver的…...
maven多模块项目搭建
文章目录 创建方式创建父项目创建子模块 目录结构示例父模块模块A模块B(并在模块B中引入模块A) 注意事项 创建方式 创建父项目 #创建文件夹后,进入目录,执行以下命令 PS D:\demo> mvn archetype:generate #将输出很多模板&am…...
PostgreSQL的视图pg_tables
PostgreSQL的视图pg_tables pg_tables 是 PostgreSQL 中的一个系统视图,用于显示当前数据库中所有用户定义的表的信息。这个视图提供了关于表的名称、所属模式(schema)、所有者以及表类型等详细信息。 pg_tables 视图的主要列 列名类型描述…...
Stable diffusion采样器详解
在我们使用SD web UI的过程中,有很多采样器可以选择,那么什么是采样器?它们是如何工作的?它们之间有什么区别?你应该使用哪一个?这篇文章将会给你想要的答案。 什么是采样? Stable Diffusion模…...
为什么要进行渗透测试?
渗透测试的重要性 渗透测试是一种安全评估技术,旨在模拟黑客攻击,发现和利用系统漏洞,以评估企业信息系统的安全性。以下是进行渗透测试的几个主要原因: 1.发现潜在的漏洞和安全风险:渗透测试可以模拟真实的攻击行为…...
后方碰撞预警系统技术规范(简化版)
后方碰撞预警系统技术规范(简化版) 1 系统概述2 预警区域3 预警目标4 功能需求功能条件5 显示需求6 指标需求1 系统概述 后方碰撞预警系统RCW(Rear Collision Warning)是在后方车辆即将与自车发生碰撞之前,激活危险警告灯以较高频率闪烁,从而吸引后方驾驶员的注意力,避免…...
Position定位
Position定位 CSS中position属性是比较常用的元素定位方案,position常用的取值有static、relative、absolute、fixed、sticky、inherit。 static static属性是HTML元素的默认值,即没有定位,遵循正常的文档流对象,对于top、bott…...
npm install 的原理
1. 执行命令发生了什么 ? 执行命令后,会将安装相关的依赖,依赖会存放在根目录的node_modules下,默认采用扁平化的方式安装,排序规则为:bin文件夹为第一个,然后是开头系列的文件夹,后…...
基于I2C协议的OLED显示(利用U82G库)
目录 一、I2C协议 1、了解I2C协议的基本原理和时序协议 基本原理 时序协议 2、掌握0.96寸OLED屏的工作原理,汉字点阵显示原理 OLED 工作原理 汉字点阵显示原理 3、掌握开源GUI库U82G在stm32上的移植编译方法,以及图形界面可视化技术。 二、具体…...
【文末附gpt升级秘笈】探索AGI之路:穿越大模型的冰与火,谱写未来技术的乐章
探索AGI之路:穿越大模型的冰与火,谱写未来技术的乐章 摘要 随着人工智能技术的飞速发展,大模型成为了业界关注的焦点。然而,大模型并非万能,其背后隐藏着诸多迷思与挑战。本文基于“AGI技术50人”访谈栏目的素材&…...
国内12寸先进封装厂家的一些情况
一、12寸先进封装厂家 在中国大陆,专注于12英寸(300mm)晶圆的先进封装技术的企业包括但不限于以下几家: 1. 长电科技(JCET Technologies Co., Ltd.):长电科技是中国领先的半导体封装测试企业之…...
【代码随想录训练营】【Day 48】【动态规划-7】| 卡码 57, Leetcode 322, 279
【代码随想录训练营】【Day 48】【动态规划-7】| 卡码 57, Leetcode 322, 279 需强化知识点 python 的幂次计算, 10 ** 5, 10 **(0.5) 题目 卡码 57. 爬楼梯(第八期模拟笔试) 注…...
【Qt】Qt常见的数据类型
思维导图 学习目标 一、基础类型 因为Qt是一个C的框架,因此C的语法和数据类型在Qt中都是被支持的,但是Qt中也是定义了一些属于自己的数据类型,不过,好多数据类型都是对C的数据类型进行封装,下面来简要介绍一下这些基…...
【源码】Spring Data JPA原理解析之事务执行原理
Spring Data JPA系列 1、SpringBoot集成JPA及基本使用 2、Spring Data JPA Criteria查询、部分字段查询 3、Spring Data JPA数据批量插入、批量更新真的用对了吗 4、Spring Data JPA的一对一、LazyInitializationException异常、一对多、多对多操作 5、Spring Data JPA自定…...
第十一篇——信息增量:信息压缩中的保守主义原则
目录 一、背景介绍二、思路&方案三、过程1.思维导图2.文章中经典的句子理解3.学习之后对于投资市场的理解4.通过这篇文章结合我知道的东西我能想到什么? 四、总结五、升华 一、背景介绍 通过信息中的保守主义,我想到了现实中人的保守主义一样&#…...
中国飞行器设计创新大赛多旋翼无人机任务飞行
源码:后续补充 1、启动launch文件 roslaunch robot_bringup mission.launch <launch> <!--启动mavros节点 --><include file"$(find mavros)/launch/px4.launch" /><!--启动USB摄像头节点 --><include file"$(find…...
WPF-UI布局
WPF布局元素有如下几个: Grid:网格。可以自定义行和列并通过行列的数量、行高和列宽来调整控件的布局。StackPanel:栈式面板。可将包含的元素在竖直或水平方向上排成一条直线,当移除一个元素后,后面的元素会自动向前移…...
武忠祥17堂课没必要全听,这几个才是精华!
作者:Captain 链接:https://www.zhihu.com/question/381665751/answer/3197724055 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 17堂课类似于习题课,是专题训练 17堂课省略了…...
网站编辑转行做文案/软件培训
前言 很多朋友问我的博客是什么软件写的,嘻嘻,其潜台词是我的博客页面还挺好看的呢!!!心里美滋滋的,这里就把方法共享出来吧 定制样式而已 我的博客主要是对H1的样式做了一点改变,给H1加上了背景…...
做网站需要公司吗/广州网站运营专注乐云seo
By: fulinux E-mail: fulinux@sina.com Blog: https://blog.csdn.net/fulinus 喜欢的盆友欢迎点赞和订阅! 你的喜欢就是我写作的动力! 目录 ROCKCHIP I2C 开发指南概述1. I2C 流程1.1 Trasmint only mode(I2C_CON[1:0]=2’b00)1.2 Mix mode (I2C_CON[1:0]=2’b01 or I2C_CON[…...
郑州营销型网站制作教程/广安seo外包
目录导入sql文件navicat中直接导入mysql shell中导入linux shell中导入导出sql文件navicat导出sql文件linux shell中导入sql文件导入sql文件 一份写好的sql文件,包括建表语句和执行语句 navicat中直接导入 导入成功 mysql shell中导入 将 .sql文件放入xshell目…...
新浪sae安装wordpress/东莞搜索引擎推广
大家在做淘宝的时候,每个小伙伴的店铺都肯定会有新品上架,既然是新品上架,遇到的问题肯定也是非常多的,那么今天我们来讲的是新品上架时如何获得高权重? 第一步:产品上架 一、小伙伴们都知道新的产品上架的…...
wordpress 不能改邮箱/揭阳新站seo方案
忽然发现自己工作已经快一年了,想想这一年的收获却不知道哪些能拿得出手....最初刚参加工作:由于比较大的工程项目,每天都很忙,给自己的懈怠的理由是,现在太忙了没时间学习,等有时间再好好学习。而等到第一个大型的工程…...
漯河做网站/网络小说网站三巨头
所以情况就是这样:我正在创建一个多人游戏,我希望我的朋友……,能够为它创建机器人.所以我要做的是创建一个抽象类Bot {},并为机器人定义函数,然后他们必须实现它们:非常简单.我被卡住了,之后如何添加它们?您可以使用反射或类似的东西来找到B…...