task4

博客主要介绍了Python编程相关知识。包括函数的定义、参数与作用域,函数可通过关键字def定义,参数分形参和实参,变量有局部作用域;还提及函数返回值。此外,讲解了文件的读写方式、文件对象操作方法,以及对Excel和CSV文件的操作,最后介绍了OS模块和datetime模块。

函数

函数是指可重复使用的程序片段,他们允许你为某个代码块赋予名字,允许你通过这一特殊的名字在你的程序任何地方来运行代码块,并可重复任何次数。这就是所谓的调用函数。Calling

函数可以通过关键字def 来定义。这一关键字后跟一个函数的标识符名称,再跟一堆圆括号,其中可以包括一些变量的名称,再以冒号结尾,结束这一行。随后而来的语句块是函数的一部分。

#定义函数,使用代码def定义函数
def greet_user():
    """显示简单的问候语"""#文本字符串的注释
    print("hello")
greet_user()

函数参数与作用域

参数

形参parameters
实参arguments
函数可以获取参数,这个参数的值由你所提供,借此,函数便可以利用这些值来做一些事情,这些参数与变量类似,这些变量的值在我们调用函数时已经被定义,且在函数运行时已经赋值完成。

#形参 函数完成工作需要的信息
#实参 调用函数是传递给函数的信息
def display_message(learned):
    print("today,i have study "+learned.title())
display_message("define")
#其中,learned为形参,而define为实参

作用域scope

局部变量,当你在一个函数中声明变量时,他们不会以任何方式与身处函数之外但具有相同名称的变量产生关系,也就是说,这些变量名只存在于函数这一局部,Local,这被称为变量的作用域,所有变量的作用域是他们定义的块,从定义他们的名字的定义点开始。

x=50#在函数的主代块中声明这一参数的值

def func(x):
    print("x is ",x)
    x=2#在这里的x为这一函数的局部变量,因此,在改变函数中x的值的时候,主代码块中的x不会受到影响。
    print("change local x to ",x)

func(x)
print("x is still ",x)#这里的print输出的为主代码块中的x的值,由此确定它实际上并不受先前调用函数中的局部变量的影响

运行结果
x is 50
change local x to 2
x is still 50

函数返回值

函数并非总是直接显示输出的,他可以处理一些数据,并返回一个或一组数值,函数返回的值被称为“返回值”

def get_formatted_name(first_name,last_name):
    """返回整洁的姓名"""
    full_name=first_name+" "+last_name
    return full_name.title()#将结果返回到函数调用行

musician=get_formatted_name("jimi","hendrix")#用于储存
print(musician)

file

打开文件的方式(读写两种)

https://www.liaoxuefeng.com/wiki/1016959663602400/1017607179232640

f=open("","r")#其中r表示读
f.read()
f,close()
f=open("","w")#其中w表示写
f.write()
f.close()

文件对象的操作方法

学习对excel及CSV文件进行操作

在这里插入图片描述
Excel结构
workbook
add_sheet
write

OS模块

http://www.cnblogs.com/sunyang945/p/7900957.html

datetime模块

https://www.liaoxuefeng.com/wiki/1016959663602400/1017648783851616

from datetime import datetime
now=datetime.now()
print(now)
    
from datetime import datetime
dt=datetime(2019,5,17,17,7)
print(dt)
在 C# 中使用 `Task.Run` 并行执行多个任务时,输出顺序混乱通常是由并发执行机制和共享资源访问竞争导致的。当多个任务同时运行并尝试向控制台输出信息时,由于操作系统调度线程的不确定性,可能导致输出内容交错或重复显示特定任务名称[^1]。 ### 输出顺序混乱的原因 1. **任务并行性** `Task.Run` 会将任务提交到线程池中异步执行,这意味着多个任务可能在同一时间段内交替运行。操作系统根据可用资源动态分配线程,因此无法保证任务的执行顺序[^2]。 2. **闭包捕获问题** 在循环中创建任务时,如果直接使用循环变量 `i`,可能会导致所有任务引用同一个变量实例,最终输出错误的索引值。例如,在以下代码中: ```csharp for (int i = 0; i < 3; i++) { tasks[i] = Task.Run(() => DoWork($"Task {i + 1}")); } ``` 所有任务可能都引用了 `i` 的最终值(如 `3`),从而导致输出为 “Task 4” 三次。 3. **控制台输出竞争** 控制台是共享资源,多个任务同时调用 `Console.WriteLine` 可能导致输出内容交错。例如,一个任务打印了部分字符串后被抢占,另一个任务开始输出,最终造成信息混杂。 --- ### 示例代码分析 以下为原始代码片段: ```csharp public static void Main() { Task[] tasks = new Task[3]; for (int i = 0; i < 3; i++) { tasks[i] = Task.Run(() => DoWork($"Task {i + 1}")); } Console.WriteLine("All tasks completed. Proceeding to next step."); } private static void DoWork(string taskName) { Console.WriteLine($"{taskName} is starting..."); Task.Delay(1000).Wait(); Console.WriteLine($"{taskName} is completed."); } ``` 此代码中存在两个主要问题: - **闭包捕获问题**:在 `for` 循环中直接使用 `i`,导致所有任务可能读取相同的 `i` 值。 - **未等待任务完成**:主线程未等待所有任务完成就继续执行后续逻辑,可能导致部分任务尚未执行完毕,程序就已结束。 --- ### 改进方案 #### 修复闭包捕获问题 将循环变量复制到局部变量中再传递给任务体: ```csharp for (int i = 0; i < 3; i++) { int taskId = i; tasks[taskId] = Task.Run(() => DoWork($"Task {taskId + 1}")); } ``` #### 等待所有任务完成 使用 `Task.WaitAll` 确保主线程等待所有任务完成后才继续执行: ```csharp Task.WaitAll(tasks); Console.WriteLine("All tasks completed. Proceeding to next step."); ``` 或者使用 `async/await` 实现更清晰的异步等待: ```csharp public static async Task Main() { Task[] tasks = new Task[3]; for (int i = 0; i < 3; i++) { int taskId = i; tasks[taskId] = Task.Run(() => DoWork($"Task {taskId + 1}")); } await Task.WhenAll(tasks); Console.WriteLine("All tasks completed. Proceeding to next step."); } ``` --- ### 同步与异步等待的区别 - `Task.WaitAll` 是阻塞方式,适用于非异步上下文,但可能导致主线程阻塞。 - `await Task.WhenAll` 是非阻塞方式,更适合 UI 应用或 Web 应用中保持主线程响应性[^1]。 --- ### 控制台输出同步化 若希望避免输出内容交错,可使用锁机制确保一次只有一个任务写入控制台: ```csharp private static readonly object lockObj = new object(); private static void DoWork(string taskName) { lock (lockObj) { Console.WriteLine($"{taskName} is starting..."); } Task.Delay(1000).Wait(); lock (lockObj) { Console.WriteLine($"{taskName} is completed."); } } ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值