30天Python学习计划👨💻 - 第6天 - 循环(二)和函数
编写 Python 代码的乐趣应该在于看到简洁明了、易于阅读的类,它们用少量清晰的代码表达了大量的功能——而不是冗长乏味、令人昏昏欲睡的代码。——
吉多·范·罗森
从上次中断的地方继续,我一边摆弄代码一边探索循环。然后,我开始学习编程中最重要的概念之一:函数。我详细学习了Python中的函数和方法、文档字符串、最佳实践以及作用域。我会尽力用清晰简洁的语言进行解释。
循环继续
while循环
while 循环是另一种根据特定条件多次运行代码块的方法。使用 while 循环时需要格外小心,避免意外创建无限循环,导致系统崩溃!
hungry = True
while(hungry): # This is always true so it keeps printing until system crashes!
print('Give me something to eat!!')
但是 while 循环很棒。它们编写简单,易于阅读。我们只需要告诉解释器何时停止循环。这可以通过使用一个break语句来停止循环执行并跳出循环来实现。另一种方法是将条件设为假来停止执行。
hungry = True
while(hungry):
print('Give me something to eat!!')
break # prints only once and stops the loop execution
hungry = True
satisfaction = 0
while(satisfaction < 10):
satisfaction += 1
print('Give me something to eat!!') # prints 10 times
循环的另一个特点while是它可以与else代码块结合使用。
hungry = True
satisfaction = 0
while satisfaction < 10:
satisfaction += 1
print('Give me something to eat!!')
else:
print('I am super satisfied now') # gets printed once condition is falsy
需要注意的是,如果break在 while 代码块中使用了该语句,则该else代码块不会执行。
while 循环与 for 循环
当已知需要循环遍历的对象范围时,for 循环通常很有用。而当需要多次执行某个任务但事先不知道范围时,while 循环则非常有用。
while True:
response_from_user = input('Enter some message. Enter bye to exit')
if(response_from_user == 'bye'):
break
除了上述break语句之外,还有两条语句,continue它们不会跳出循环,而是继续执行循环。这种写法pass并不常用,但有时会用作占位符,以便在循环结束后继续执行语句。
这个 Stack Overflow 帖子对此有很好的解释。
快速编码练习
让我们找出邮件列表中的重复邮件地址并打印出来。
email_list = ['roger@hey.com','michael@hey.com','roger@hey.com','prince@gmail.com']
duplicate_emails = []
for email in email_list:
if email_list.count(email) > 1 and email not in duplicate_emails:
duplicate_emails.append(email)
print(duplicate_emails)
这就是我解决问题的方法。请在评论区告诉我你会如何解决。好了!是时候换个有趣的话题,函数了。
函数
函数是一个非常重要的概念,所有编程语言都包含函数。函数允许我们定义一个动作(代码块),然后根据 DRY 原则,多次执行该动作而无需重复编写代码。到目前为止,我一直在使用 Python 提供的一些内置函数,例如print`__getitem__` input、` len__getitem__` 等。现在是时候创建自己的函数了。
def blow_fire(): # This part is called function definition
print('fire 🔥 🔥 🔥')
blow_fire() # This part is called function invocation
blow_fire() # It can be called any number to times to perform some action
参数和参数
上面的函数挺酷的,但也有一些局限性。它只能执行相同的操作。让我们让它更具扩展性,通过传递一些数据,让它能够执行任意操作。
def blower(name, emoji): # parameters
print(f'{name} {emoji} {emoji} {emoji}')
blower('fire', '🔥') # arguments
blower('water', '🌊')
定义函数时,当我们向函数提供一些数据以使其根据这些数据执行某些操作时,提供的数据称为参数。一个函数可以接受任意数量的参数。
当调用同一个函数来执行操作时,它会接受数据作为参数。这只是术语上的差异,但常常令人困惑,而且经常被混用。
上述内容也称为位置参数或位置实参,因为参数或实参的顺序或位置很重要。
def blower(name = 'fire', emoji = '🔥'): # default parameters
print(f'{name} {emoji} {emoji} {emoji}')
blower('fire', '🔥') # arguments
blower('water', '🌊')
blower() # fire 🔥 # this works as the function has default parameters defined
返回
return`return` 是 Python 中的一个关键字,用于从函数返回一个值。为了使函数更有用,它需要根据表达式的求值结果返回一个值。如果没有指定 `return` 语句,或者 `return` 语句的表达式求值结果不是数据类型,则函数返回 `None` None。在 JavaScript 中,这None可以与 `.` 关联起来void。
该return语句终止函数并退出。
def multiplier(num1, num2):
return num1 * num2
result = multiplier(2,3)
print(result) # 6
是时候利用这个return语句做点酷的事情了。
def sum(num1):
def child(num2):
return num1 + num2
return child
add_10 = sum(10)
print(add_10(20)) # 30 (Closure!!!)
print(add_10(50)) # 60
print(add_10(100)) # 110
太棒了!我刚刚验证了Python 和 JavaScript 一样,也有闭包的概念。它在创建工厂函数方面非常有效。在上面的代码块中,我创建了一个名为`add_10`的通用函数,并向其传递动态参数,从而生成不同的结果。是不是很酷!
下周学习Python函数式编程概念时,我会更深入地探讨这个问题。
方法本质上是定义在对象内部的函数,或者说,它们“归对象所有”。
.调用方法时,需要使用对象名后跟运算符。
文档字符串
编写自定义函数时,最好明确说明函数的目标,这样其他同事或代码用户在使用时就能轻松理解函数的功能。集成开发环境 (IDE) 会显示函数的相关信息。此外,如果存在辅助函数或方法,也可以通过它们来查看函数的相关信息。
“代码告诉你怎么做;注释告诉你为什么。”
——杰夫·阿特伍德(笔名“代码恐怖”)
def test_function():
'''
This function just prints test to the console.
'''
print('test')
test_function()
“代码更多的是被阅读而不是被编写。”
——吉多·范·罗森
https://www.programiz.com/python-programming/docstrings
*args 和 **kwargs
*args 是 arguments 的缩写,**kwargs 代表 keyword arguments。当函数需要接受任意数量的参数或关键字参数时,就需要用到它们。
def powerful_function(*args):
print(args)
powerful_function(1,3,2) # (1, 3, 2) --> Returns a tuple
def super_function(**kwargs):
print(kwargs)
super_function(name='John', age='45') # {'name': 'John', 'age': '45'} --> Returns a dict
https://www.programiz.com/python-programming/args-and-kwargs
在 JavaScript 世界中,ES6 的剩余参数用于提取传递给函数的所有参数。又一个思维模型诞生了!
范围
简单来说,作用域指的是“我可以访问哪些变量?”。解释器在读取代码以确定变量作用域时,就会提出这类问题。在 Python 中,变量具有函数 作用域,这意味着在函数内部定义的变量无法在函数外部访问。
num = 1
def confusing_function():
num = 10
return num
print(num) # 1 => Global Scope
print(confusing_function()) # 10 => Local Scope
以下是Python解释器遵循的作用域规则:
- 首先检查本地变量是否存在。如果存在,则获取其值。如果不存在,则继续执行后续步骤。
- 变量是否在父函数的局部作用域中定义?如果存在,则获取其值;否则,继续执行后续步骤。
- 变量是否存在于全局作用域中?如果存在,则获取其值;否则,继续执行后续步骤。
- 该变量是否为内置函数?如果是,则获取其值;否则,退出。
今天就到这里。我已经讲解了大部分 Python 基础知识。现在是时候深入学习一些高级主题了,但在此之前,我想明天先搭建一下开发环境,并了解一下各种可用的工具和程序,以完成第一周的学习计划。
我希望我用浅显易懂的语言解释了我的语言学习过程。如果您觉得哪里不清楚,或者有任何其他建议或想法,请在评论区告诉我。
祝你一切顺利!
文章来源:https://dev.to/arindamdawn/30-days-of-python-day-6-3ghp