python带参数装饰器 函数名_python 全栈开发,Day11(函数名应用,闭包,装饰器初识,带参数以及带返回值的装饰器)...

一、函数名应用

函数名是什么?函数名是函数的名字,本质:变量,特殊的变量。

函数名(),执行此函数。

python 规范写法

1. #后面加一个空格,再写内容,就没有波浪线了。

2.一行代码写完,下面一行的的内容要空2行,

3.逗号2个边的内容要有空格。

如果是不规范的写法,Pycharm编辑器,会有灰色的波浪线显示。

1.单独打印函数名

def func1():

print(666)

print(func1)

执行输出:

打印的是一个函数内存地址

2.函数名的赋值

def func2():

print(666)

f = func2

print(f())

执行输出:

666

None

3.函数名可以作为容器类数据的元素

下面的函数都要执行

def f1():

print(111)

def f2():

print(222)

def f3():

print(333)

def f4():

print(444)

写4个执行代码就可以了

f1()

f2()

f3()

f4()

如果是100个呢?

使用for循环批量执行函数

def f1():

print(111)

def f2():

print(222)

def f3():

print(333)

def f4():

print(444)

l1 = []

for i in range(1, 5):

l1.append('f' + str(i))

for i in l1:

eval(i)()

执行输出:

111

222

333

444

4.函数名可以作为参数

def f1():

print(666)

def f2(x):

x()

f2(f1)

执行输出:

666

分析如下:

def f1():

print(666)

def f2(x): # x = f1

x() # f1()

f2(f1) #将f1函数作为变量传参给f2,x()表示执行函数f1(),输出666

5.函数名可以作为函数的返回值。

def f11(x):

return x #将返回值传给调用者f11(5),此时ret = 5

ret = f11(5)

print(ret)

执行输出:

5

def f1():

print(666)

def f2(x):

return x

f2(f1)()

执行输出:

666

代码分析:

def f1():

print(666)

def f2(x): # x = f1

return x #将f1返回给函数调用者f2(f1),此时就相当于 f1 = f2(f1)

f2(f1)() #将f1函数作为变量传参给f2,return之后f2(f1)等于f1,f1()就表示执行f1函数,输出666

f1是一个特殊变量,加()就可以执行了

第一类对象( first-class object)指

1.可在运行期创建

2.可用作函数参数或返回值

3.可存入变量的实体

*不明白?那就记住一句话,就当普通变量用

函数名就是第一类对象

加括号,就可以执行了。

二、闭包

闭包函数:

内部函数包含对外部作用域而非全剧作用域变量的引用,该内部函数称为闭包函数

有如下代码,请补全代码,在函数外部执行inner()函数

def wrapper():

def inner():

print(666)

第一种写法

def wrapper():

def inner():

print(666)

inner()

wrapper()

执行输出:

666

第二种写法

def wrapper():

def inner():

print(666)

return inner #将inner函数返回给调用者ret,此时ret = inner

ret = wrapper()

ret() #执行inner函数

执行输出:

666

ret = wrapper()

ret()

等同于

wrapper()()

return inner之后,inner由临时空间,转换为全局空间了。

因为ret赋值了

闭包举例

def wrapper():

name = '老男孩'

def inner():

print(name)

inner()

wrapper()

执行输出:

老男孩

如何判断它是否是一个闭包函数呢? 内层函数名.__closure__  cell 就是=闭包

def wrapper():

name = '老男孩'

def inner():

print(name)

inner()

print(inner.__closure__)

wrapper()

执行输出:

老男孩

(,)

出现了cell,就表示它是一个闭包函数

name = '老男还'

def wrapper():

def inner():

print(name)

inner()

print(inner.__closure__)

wrapper()

执行输出:

老男还

None

返回值为None 表示它不是闭包

因为name是一个全局变量

如果函数调用了外层变量而非全局变量,那么它就是闭包

name = '老男还'

def wrapper2():

name1 = 'alex'

def inner():

print(name)

print(name1)

inner()

print(inner.__closure__)

wrapper2()

执行输出:

老男还

alex

(,)

只要引用了外层变量至少一次,非全局的,它就是闭包

面试题:

下面的函数,是一个闭包吗?

name = '老男孩'

def wraaper2(n):

# n = '老男孩' 相当于

def inner():

print(n)

inner()

print(inner.__closure__) # None

wraaper2(name)

它也是一个闭包

虽然wraaper2传了一个全局变量,但是在函数wraaper2内部,inner引用了外层变量,相当于在函数inner外层定义了n = '老男孩',所以inner是一个闭包函数

闭包的好处

当函数开始执行时,如果遇到了闭包,他有一个机制,他会永远开辟一个内存空间,将必包中的变量等值放入其中,不会随着函数的执行完毕而消失。

举一个例子

from urllib.request import urlopen

content = urlopen('http://www.xiaohua100.cn/index.html').read().decode('utf-8')

print(content)

执行输出,是一堆网页源代码。

爬3次

from urllib.request import urlopen

content1 = urlopen('http://www.xiaohua100.cn/index.html').read().decode('utf-8')

content2 = urlopen('http://www.xiaohua100.cn/index.html').read().decode('utf-8')

content3 = urlopen('http://www.xiaohua100.cn/index.html').read().decode('utf-8')

内存开了3次,很占用内存

把它封装成闭包

from urllib.request import urlopen

def index():

url = "http://www.xiaohua100.cn/index.html"

def get():

return urlopen(url).read()

return get

xiaohua = index()

content = xiaohua()

print(content)

这个例子,只有第一遍,是从网站抓取的。

之后的执行,直接从内存中加载,节省内存空间

三、装饰器初识

装饰器本质上就是一个python函数,他可以让其他函数在不需要做任何代码变动的前提下,增加额外的功能,装饰器的返回值也是一个函数对象。

装饰器的应用场景:比如插入日志,性能测试,事务处理,缓存等等场景。

现在我有一个需求,我想让你测试这个函数的执行时间,在不改变这个函数代码的情况下:

先写一个雏形

import time

def func1():

print('in func1')

time.sleep(1) # 模拟程序逻辑

start = time.time()

func1()

print(time.time() - start)

执行输出:

in func1

1.0001070499420166

封装成函数

传一个参数,函数名,就可以查看函数的执行时间了

import time

def func1():

print('in func1')

time.sleep(1) # 模拟程序逻辑

def timmer(f):

start_time = time.time()

f()

end_time = time.time()

print('此函数的执行时间为{}'.format(end_time - start_time))

timmer(func1)

执行输出:

in func1

此函数的执行时间为1.0002098083496094

原来100个函数,都是调用了func1(),现在测试函数,需要timeer(func1)。如果想测试所有调用地方的执行时间,那么需要修改100个函数位置,改成timeer(func1),太麻烦了。

不能更改原来的调用方式,同时需要加一个函数执行时间的功能。怎么办呢?

要无限接近于原来的调用方法,慢慢来

先来讲一个变量赋值的例子

a = 1

b = a

a = 2 #a重新赋值了,原来a的值不存在了。但是b还是等于原来a的值,也就是1

print(a,b)

执行输出2,1

892359ff51a286283359210d0644712f.png

1.更改执行方式

import time

def func1():

print('in func1')

time.sleep(1) # 模拟程序逻辑

def timmer(f):

start_time = time.time()

f()

end_time = time.time()

print('此函数的执行时间为{}'.format(end_time - start_time))

f1 = func1 #定义f1等于func1函数

func1 = timmer #定义func1等于timmer,等式计算右边的。此时func1被覆盖了,和原来的没有任何关系,f1还是等于原来的func1

func1(f1) #此时相当于执行 timmer(老的func1)

执行输出:

in func1

此函数的执行时间为1.0001263618469238

在精简一步

import time

def func1():

print('in func1')

time.sleep(1) # 模拟程序逻辑

def timmer(f): # f = func1

def inner():

start_time = time.time()

f() #执行func1()

end_time = time.time()

print('此函数的执行时间为{}'.format(end_time - start_time))

return inner #将inner函数返回给函数调用者timmer(func1)

a = timmer(func1) #等式计算右边的,将func1函数传给timmer函数

a() #此时相当于执行了inner函数

执行输出:

in func1

此函数的执行时间为1.000577449798584

最终版本

import time

def timmer(f): # 2接收参数.f = func1

def inner():

start_time = time.time() #5.进入inner函数

f() #6.执行f(),也就是原来的func1函数。虽然func1被覆盖了,但是之前的值还存在。请参考上面a,b赋值的例子

end_time = time.time() #10 获取当前时间

print('此函数的执行时间为{}'.format(end_time - start_time)) #11.输出差值

return inner #3.将inner函数返回给函数调用者timmer(func1),此时程序结束,继续执行func1()

def func1(): #7.进入函数

print('in func1') # 8.打印输出

time.sleep(1) # 9.等待1秒

func1 = timmer(func1) #1.等式计算右边的,将func1函数传给timmer函数,此时func1被覆盖了,原来func1的不存在了。

func1() #4.这里的func1是全新的func1,就是上面的赋值,此时相当于执行 inner函数

代码从上至下执行,先加载函数变量timmer和func1。在执行上文说的第1步以及后面的,请看数字。

执行输出:

in func1

此函数的执行时间为1.0009608268737793

但是加这一步,还是不太方便。那么python给这种情况,加了一个语法糖@

语法糖指那些没有给计算机语言添加新功能,而只是对人类来说更"甜蜜"的语法

import time

def timmer(f): # f = func1

def inner():

start_time = time.time()

f() #执行func1()

end_time = time.time()

print('此函数的执行时间为{}'.format(end_time - start_time))

return inner #将inner函数返回给函数调用者timmer(func1)

#语法糖@

@timmer #相当于 func1 = timmer(func1) #这一步就已经覆盖了

def func1():

print('in func1')

time.sleep(1) # 模拟程序逻辑

func1() #相当于执行了inner()函数

想测试谁,前面加@装饰器函数,即可。

装饰器利用return制造了一个假象,func1()执行,其实是执行了inner()

func1()已经把原来的func1()给覆盖了

这个装饰器,还不够完整,函数不能传参数

先来举个例子

def func2(a1,b1): #4.执行函数,接收位置参数a1=1,b1=2

print(a1,b1) #5. 输出1,2

def func3(a,b): #2. 接收参数,a=1,b=2

func2(a,b) #3. 执行函数func2(1,2)

func3(1,2) #1.传位置参数1,2

执行输出:

1 2

func3执行一遍后,将a,b的值,传给a1,b1了

上面装饰器的例子,func1,要传2个参数a,b

import time

def timmer(f):

def inner(a,b):

start_time = time.time()

f(a,b)

end_time = time.time()

print('此函数的执行时间为{}'.format(end_time - start_time))

return inner

@timmer

def func1(a,b):

print('in func1 {}{}'.format(a,b))

time.sleep(1) # 模拟程序逻辑

func1(1,2)

执行输出:

in func1 12

此函数的执行时间为1.0006024837493896

如果有多个参数呢?改成动态参数

import time

def timmer(f):

def inner(*args,**kwargs):

start_time = time.time()

f(*args,**kwargs)

end_time = time.time()

print('此函数的执行时间为{}'.format(end_time - start_time))

return inner

@timmer

def func1(*args,**kwargs):

print('in func1 {}{}'.format(args,kwargs))

time.sleep(1) # 模拟程序逻辑

func1(1,2,a='3',b=4)

执行输出:

in func1 (1, 2){'b': 4, 'a': '3'}

此函数的执行时间为1.000101089477539

面试题,手写一个装饰器

写装饰器,约定俗成,函数名为wrapper

第一步

def wrapper(func):

def inner():

func()

return inner

第二步

def wrapper(func):

def inner(*args,**kwargs):

func(*args,**kwargs)

return inner

第三步

def wrapper(func):

def inner(*args,**kwargs):

'''被装饰函数之前'''

ret = func(*args,**kwargs)

'''被装饰函数之后'''

return ret

return inner

完整的

def wrapper(func):

def inner(*args,**kwargs):

'''被装饰函数之前'''

ret = func(*args,**kwargs)

'''被装饰函数之后'''

return ret

return inner

@wrapper

def func(*args,**kwargs):

print(args,kwargs)

return 666

print(func())

作业:

使用函数完成用户登录和注册功能

#先让用户选择,是登陆还是注册

#选择序号完毕之后,运行相应的程序,

#验证成功之后,可以让其继续选择,登陆还是注册,还可以选择退出。

1.先准备函数的雏形

def registered_username(username):

'''

#判断注册用户名是否存在

:param username: 用户名

:return: True 存在 False 不存在

'''

def write_file(username,password):

'''

#写入用户列表文件

:param username: 用户名

:param password: 密码

:return: True 写入成功 False 写入失败

'''

def username_password(username,password):

'''

#判断用户名和密码是否匹配

:param username: 用户名

:param password: 密码

:return: True 匹配成功 False 匹配失败

'''

def register(*args,**kwargs):

'''

注册逻辑

:return:

'''

pass

def login(*args,**kwargs):

'''

登录逻辑

:return:

'''

pass

def user_menu(*args,**kwargs):

'''

# 用户菜单

'''

pass

2.先写菜单

def user_menu(*args,**kwargs):

'''

# 用户菜单

'''

# 判断文件是否存在,不存在创建文件

file_exists()

# 循环

while True:

# 打印菜单

menu = ['注册', '登录', '退出']

print('bbs系统'.center(25, '#'))

for i in range(len(menu)):

print('{}\t{}'.format(i + 1, menu[i]))

print(''.center(27, '#'))

number = input('请选择序号: ').strip()

if number == '1':

# 执行注册程序

register()

elif number == '2':

# 执行登录程序

login()

elif number == '3':

exit()

else:

print('输入错误,请重新输入!')

3.写判断用户列表文件是否存在

def file_exists(*args,**kwargs):

'''

# 判断用户列表文件是否存在

:return: True 存在 False 不存在

'''

# 判断文件是否存在

if os.path.exists(file_name):

return True

else:

with open(file_name, encoding='utf-8', mode='w') as mk:

mk.write('张三 123')

return False

4.再写注册逻辑

def register(*args,**kwargs):

'''

注册逻辑

:return:

'''

while True:

username = input('请输入注册的用户名,或输入q返回菜单:').strip()

if username == '':

print('用户名为空,请重新输入!')

elif username.upper() == 'Q':

break

else:

# 执行判断用户名函数

result = registered_username(username)

if result:

password = input('请输入您的注册的密码:').strip()

# 判断密码

if password == '':

print('密码为空,请重新输入!')

else:

# 执行写入用户列表文件函数

result = write_file(username, password)

if result:

print('注册成功!,您的用户名为: {}\n倒计时2秒返回菜单!'.format(username))

time.sleep(2)

user_menu()

else:

print('注册失败!请重试')

else:

print('用户名已经存在,请重新输入!')

5.判断注册用户名是否可用

def registered_username(username):

'''

#判断注册用户名是否可用

:param username: 用户名

:return: True 可用(用户不存在) False 不可用(用户已存在)

'''

# 纯用户名列表,不包含密码

user_list = []

with open(file_name, encoding='utf-8') as f1:

for i in f1:

# 去空格,以空格切割,转换为列表

li = i.strip().split() # [张三,123]

# 将用户名追加到列表中

user_list.append(li[0])

# 判断用户名是否存在列表中

if username in user_list:

# 返回False

return False

else:

return True

6.写入用户列表文件

def write_file(username,password):

'''

#写入用户列表文件

:param username: 用户名

:param password: 密码

:return: True 写入成功 False 写入失败

'''

with open(file_name, encoding='utf-8', mode='a') as f2:

f2.write('\n{} {}'.format(username, password))

return True

7.登录逻辑

def login(count=0,max=3):

'''

登录逻辑

:param count: 初始失败次数

:param max: 最大失败次数

:return:

'''

while count < max:

count += 1

username = input('请输入用户名:').strip()

password = input('请输入密码:').strip()

# 执行验证用户名和密码函数

result = username_password(username,password)

if result:

print('登陆成功\n倒计时1秒返回菜单!')

time.sleep(1)

user_menu()

break

else:

print('用户名或密码错误,还剩余{}次机会!'.format(max - count))

# 返回主菜单

user_menu()

8.判断用户名和密码是否匹配

def username_password(username,password):

'''

#判断用户名和密码是否匹配

:param username: 用户名

:param password: 密码

:return: True 匹配成功 False 匹配失败

'''

# print(username,password)

with open(file_name, encoding='utf-8', mode='r') as f3:

for i in f3:

# print(i)

# 去空格,以空格切割,转换为列表

li = i.strip().split() # [张三,123]

# 判断用户名和密码是否匹配

if username == li[0] and password == li[1]:

result = True

# 当找到匹配时,跳出循环

break

else:

result = False

# 当整个用户列表遍历完成之后,再return

return result

最终完整代码如下:

# -*- coding: utf-8 -*-

import time,os

#文件名

file_name = 'user_list.txt'

def file_exists(*args,**kwargs):

'''

# 判断用户列表文件是否存在

:return: True 存在 False 不存在

'''

# 判断文件是否存在

if os.path.exists(file_name):

return True

else:

with open(file_name, encoding='utf-8', mode='w') as mk:

mk.write('张三 123')

return False

def registered_username(username):

'''

#判断注册用户名是否可用

:param username: 用户名

:return: True 可用(用户不存在) False 不可用(用户已存在)

'''

# 纯用户名列表,不包含密码

user_list = []

with open(file_name, encoding='utf-8') as f1:

for i in f1:

# 去空格,以空格切割,转换为列表

li = i.strip().split() # [张三,123]

# 将用户名追加到列表中

user_list.append(li[0])

# 判断用户名是否存在列表中

if username in user_list:

# 返回False

return False

else:

return True

def write_file(username,password):

'''

#写入用户列表文件

:param username: 用户名

:param password: 密码

:return: True 写入成功 False 写入失败

'''

with open(file_name, encoding='utf-8', mode='a') as f2:

f2.write('\n{} {}'.format(username, password))

return True

def username_password(username,password):

'''

#判断用户名和密码是否匹配

:param username: 用户名

:param password: 密码

:return: True 匹配成功 False 匹配失败

'''

# print(username,password)

with open(file_name, encoding='utf-8', mode='r') as f3:

for i in f3:

# print(i)

# 去空格,以空格切割,转换为列表

li = i.strip().split() # [张三,123]

# 判断用户名和密码是否匹配

if username == li[0] and password == li[1]:

result = True

# 当找到匹配时,跳出循环

break

else:

result = False

# 当整个用户列表遍历完成之后,再return

return result

def register(*args,**kwargs):

'''

注册逻辑

:return:

'''

while True:

username = input('请输入注册的用户名,或输入q返回菜单:').strip()

if username == '':

print('用户名为空,请重新输入!')

elif username.upper() == 'Q':

break

else:

# 执行判断用户名函数

result = registered_username(username)

if result:

password = input('请输入您的注册的密码:').strip()

# 判断密码

if password == '':

print('密码为空,请重新输入!')

else:

# 执行写入用户列表文件函数

result = write_file(username, password)

if result:

print('注册成功!,您的用户名为: {}\n倒计时2秒返回菜单!'.format(username))

time.sleep(2)

user_menu()

else:

print('注册失败!请重试')

else:

print('用户名已经存在,请重新输入!')

def login(count=0,max=3):

'''

登录逻辑

:param count: 初始失败次数

:param max: 最大失败次数

:return:

'''

while count < max:

count += 1

username = input('请输入用户名:').strip()

password = input('请输入密码:').strip()

# 执行验证用户名和密码函数

result = username_password(username,password)

if result:

print('登陆成功\n倒计时1秒返回菜单!')

time.sleep(1)

user_menu()

break

else:

print('用户名或密码错误,还剩余{}次机会!'.format(max - count))

# 返回主菜单

user_menu()

def user_menu(*args,**kwargs):

'''

# 用户菜单

'''

# 判断文件是否存在,不存在创建文件

file_exists()

# 循环

while True:

# 打印菜单

menu = ['注册', '登录', '退出']

print('bbs系统'.center(25, '#'))

for i in range(len(menu)):

print('{}\t{}'.format(i + 1, menu[i]))

print(''.center(27, '#'))

number = input('请选择序号: ').strip()

if number == '1':

# 执行注册程序

register()

elif number == '2':

# 执行登录程序

login()

elif number == '3':

exit()

else:

print('输入错误,请重新输入!')

# 执行菜单

user_menu()

执行输出:

6be69e2142c6529d65d7360112c7a4df.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/340551.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python逐行写入excel_快来看看Python如何玩转Excel

来源&#xff1a;ID(innerV)如何用Python来操作Excel文件呢&#xff1f;首先&#xff0c;使用pip 包管理器来安装两个包&#xff0c;安装命令&#xff1a;pip install xlrd pip install xlwt我们来看读取excel的例子&#xff0c;第1行&#xff0c;import 导入xlrd包第4行&#…

Java面试准备:15个Java面试问题

并非所有的访谈都将重点放在算法和数据结构上—通常&#xff0c;访谈通常只侧重于您声称是专家的语言或技术。在此类访谈中&#xff0c;通常没有任何“陷阱”问题&#xff0c;而是它们要求您利用内存和使用该语言的经验–换句话说&#xff0c;它们测试您对编程语言的了解。 但…

mysql排插问题_MySQL一次数据插入故障记录

某天突然收到报警&#xff0c;数据库大量事务等待&#xff0c;进到数据库后发线大量的插入操作被阻塞&#xff0c;且都是同一个表的。通过 show engine innodb status 发现插入操作都是在等待索引 idx_create_time(create_time) 的 insert intention lock(跟 gap 锁互斥)&#…

纯净pe工具_微PE工具箱2.0

(特殊时期&#xff0c;在家时间多一些&#xff0c;突然想到多年的公众号&#xff0c;重启试试&#xff0c;嗯就先每一天推荐一个软件吧)微PE工具箱(WinPE)是一款非常好用的PE系统(独立的预安装环境)&#xff0c;非常纯净&#xff0c;是装机维护得力的助手。安装简单&#xff0c…

sping jdbc 链接mysql_Spring Boot JDBC 连接数据库示例

文本将对在spring Boot构建的Web应用中&#xff0c;基于MySQL数据库的几种数据库连接方式进行介绍。包括JDBC、JPA、MyBatis、多数据源和事务。JDBC 连接数据库1、属性配置文件(application.properties)spring.datasource.urljdbc:mysql://localhost:3306/testspring.datasourc…

二分查找递归与非递归的时间比较_我们说一说Python的查找算法!

相信大家在面试开发岗和算法岗时&#xff0c;评委最喜欢问的就是&#xff1a;您能给我说一下查找和排序算法有哪些&#xff1f;今天咱们就说一说Python中最常用的查找算法&#xff0c;下期我们再推出排序算法。首先要明白查找是查什么&#xff1f;我们希望能给定一个值&#xf…

jsf 自定义属性_如何在JSF中实现自定义密码强度指示器

jsf 自定义属性使用JavaScript验证密码强度是一项常见任务。 在本文中&#xff0c;我将展示如何向基于JSF的Web应用程序添加密码强度指示器。 的 PrimeFaces中的密码组件已经具有密码强度的反馈指示符&#xff0c;但是它有两个主要缺点&#xff1a; 反馈指示器没有响应&#…

OAuth 2.0 Java指南:5分钟保护您的应用程序安全

使用Okta的身份管理平台轻松部署您的应用程序 使用Okta的API在几分钟之内即可对任何应用程序中的用户进行身份验证&#xff0c;管理和保护。 今天尝试Okta。 现代应用程序依赖于用户身份验证&#xff0c;但是它可能给Java开发人员带来困难的挑战&#xff0c;以及一系列特定于框…

flutter从0到1构建大前端应用 pdf_前端骨架屏都是如何生成的

作者&#xff1a;SHERlocked93转发链接&#xff1a;https://mp.weixin.qq.com/s/j2XzwLPnalDCNaKkfjH-0Q前言相比于早些年前后端代码紧密耦合、后端工程师还得写前端代码的时代&#xff0c;如今已发展到前后端分离&#xff0c;这种开发方式大大提升了前后端项目的可维护性与开发…

成为Java流大师–第1部分:创建流

在许多情况下&#xff0c;声明性代码&#xff08;例如&#xff0c;具有Streams的功能组合&#xff09;可提供出色的代码指标。 通过本动手实验文章系列进行编码&#xff0c;并成为Java Streams的主教练&#xff0c;从而成为一名更好的Java程序员。 Streams的整个想法是代表一个…

java 6 基础教程_Java小白入门教程(6)——循环语句

提纲&#xff1a;1、循环结构2、while循环3、do-while循环4、for循环5、break语句6、continue语句7、循环嵌套8、作业一、循环结构1.1 概念条件满足&#xff0c;某些代码会被反复多次的执行。条件不成立了&#xff0c;循环结束。0-n次。1.2 为什么使用循环开发中可能会把某些代…

事件触发控制_SystemVerilog线程控制与通信

01线程控制1.概述线程&#xff0c;即独立运行的程序&#xff1b;线程需要被触发执行&#xff0c;可以结束或者不结束&#xff1b;在module中的initial和always&#xff0c;都可以看作独立的线程&#xff0c;他们在仿真0时刻开始&#xff0c;而选择结束或者不结束&#xff1b;在…

java必读书籍_最佳5本Java性能调优书籍–精选,必读

java必读书籍为什么Java开发人员应该阅读有关性能调优的书&#xff1f; 当我很久以前第一次面对这个问题时&#xff0c;我以为以后会做&#xff0c;但是我很长一段时间都没有回过头来。 仅当我在用Java编写的任务关键型服务器端财务应用程序中遇到严重的性能和可伸缩性问题时&a…

成为Java流大师–第4部分:数据库流

SQL一直是一种声明性语言&#xff0c;而Java长期以来势在必行。 Java流改变了游戏规则。 通过本动手文章编写您的方式&#xff0c;并学习如何使用Java流对RDBMS数据库执行声明性查询&#xff0c;而无需编写任何SQL代码。 您会发现&#xff0c;Java流和SQL命令的动词之间有着惊人…

unsafehelper java_Java 9中将移除 Sun.misc.Unsafe

灾难将至&#xff0c;Java 9中将移除 Sun.misc.UnsafeOracle 正在计划在Java 9中去掉 sun.misc.Unsafe API。 这绝对将是一场灾难&#xff0c;有可能会彻底破坏整个 java 生态圈。 几乎每个使用 java开发的工具、软件基础设施、高性能开发库都在底层使用了 sun.misc.Unsafe。 下…

java 根据类名示例化类_如何使用示例从Java中的类路径加载资源

java 根据类名示例化类Java中的类路径不仅用于加载.class文件&#xff0c;而且还可以用于加载资源&#xff0c;例如属性文件&#xff0c;图像&#xff0c;图标&#xff0c;缩略图或任何二进制内容。 Java提供了API来将这些资源读取为InputStream或URL。 假设您在项目的config文…

java课程设计进程管理_Java课设总结(个人版)

使用物理引擎JBox2D完成游戏关卡的各个物理状态模拟根据物理引擎设计Bird,Pig,Brick等游戏中出现的可运动刚体类建立JBox2d的工具类以实现###本人对这次课设的看法与吐槽 1.课设内容的脑洞是我在看完17级学长的游戏课设之后想出的 当时还没学java网络编程的内容&#xff0c;误以…

二叉树层次遍历c语言_[LeetCode] 107. 二叉树的层次遍历 II

题目链接 : https://leetcode-cn.com/problems/binary-tree-level-order-traversal-ii/题目描述:给定一个二叉树&#xff0c;返回其节点值自底向上的层次遍历。 &#xff08;即按从叶子节点所在层到根节点所在的层&#xff0c;逐层从左向右遍历&#xff09;例如&#xff1a; 给…

使用测微计收集应用程序指标

什么是千分尺&#xff1f; 千分尺是一个简单的外观&#xff0c;用于以供应商中立的方式收集Java应用程序中的指标。 您可以考虑使用SLF4J作为指标。 Micrometer内置了对许多不同指标后端的支持&#xff0c;包括Atlas&#xff0c;Datadog&#xff0c;Elastic&#xff0c;JMX等。…

只读副本和Spring Data第1部分:配置数据库

这是有关我们为利用只读副本来提高应用程序性能而寻求的一系列博客文章。 对于这个项目&#xff0c;我们的目标是建立我们的spring数据应用程序&#xff0c;并使用read仓库进行写操作&#xff0c;并基于read副本进行读操作。 为了模拟这种环境&#xff0c;我们将通过Docker使…