函数基础

news2024/10/6 20:34:48

一、初识函数

函数,可以当做是一大堆功能代码的集合。

def 函数名():
    函数内编写代码
    ...
    ...
    
函数名()

例如:

# 定义名字叫info的函数
def info():
    print("第一行")
    print("第二行")
    print("第n行...")
    
info()

运用函数的场景:

1. 有重复代码,用函数增加代码的重用性

def send_email():
    # 10行代码

print("欢迎使用计算机监控系统")
if CPU占用率 > 90%:
    send_email()

if 硬盘使用率 > 99%:
    send_email()
    
if 内存使用率 > 98%:
    send_email()
...

2. 代码太长,用函数增强代码的可读性

    """判断是否是豹子"""
    pass

def calculate_same_color_rule():
    """判断是否是同花"""
    pass

def calculate_straight_rule():
    """判断是否顺子"""
	pass

def calculate_double_card_rule(poke_list):
    """判断是否对子"""
	pass

def calculate_single_card_rule():
    """判断是否单牌"""
    pass



# 1. 生成一副扑克牌
card_color_list = ["红桃", "黑桃", "方片", "梅花"]
card_nums = [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]  # A
all_card_list = [[color, num] for color in card_color_list for num in card_nums]

# 2.洗牌
random.shuffle(all_card_list)

# 3.给玩家发牌
...
# 4.判断牌是:豹子?同花顺?顺子?对子?单点?

calculate_same_num_rule()
calculate_same_color_rule()
calculate_straight_rule()
...

以前我们变成是按照业务逻辑从上到下逐步完成,称为:面向过程编程;现在学了函数之后,利用函数编程称为:函数式编程。

二、函数的参数

  • 注册邮箱(一般使用网易邮箱)

  • 基础配置

    • 授权码
    • SMTP服务器: smtp.126.com或者smtp.163.com
  • 代码发送邮件
    在这里插入图片描述
    在这里插入图片描述
    开启后,保留好授权码
    记住SMTP服务器的地址:
    在这里插入图片描述

以下是提供的发邮件的一个函数:

import smtplib
from email.mime.text import MIMEText
from email.utils import formataddr

# ### 1.邮件内容配置 ###
msg = MIMEText("邮件内容", 'html', 'utf-8')    # 第一个位置为邮件内容
msg['From'] = formataddr(["发件人", "发件人邮箱@163.com"])    # 邮件顶部会显示发件人(谁发来的邮件),发件人邮箱
msg['Subject'] = "主题"   # 邮件主题

# ### 2.发送邮件 ### 
server = smtplib.SMTP_SSL("smtp.163.com")
server.login("自己邮箱", "授权码")   # 第一个位置为自己的邮箱,第二个位置为授权码
server.sendmail("自己邮箱", "收件人邮箱", msg.as_string())     # 第一个位置为自己的邮箱,第二个为收件人邮箱(可跨邮箱),
server.quit()

需求:根据上述代码实现给3个用户发邮件

v1 = "a@qq.com"
v2 = "b@qq.com"
v3 = "c@live.com"
import smtplib
from email.mime.text import MIMEText
from email.utils import formataddr

def send_email(xx):
    # ### 1.邮件内容配置 ###
    msg = MIMEText("你好", 'html', 'utf-8') 
    msg['From'] = formataddr(["张三", "zhangsan@163.com"])
    msg['Subject'] = "hello"

    # ### 2.发送邮件 ### 
    server = smtplib.SMTP_SSL("smtp.163.com")
    server.login("zhangsan@163.com", "JXTSQRBCBYVNNSUE")   
    server.sendmail("zhangsan@126.com", xx, msg.as_string())
    server.quit()

send_email("a@qq.com")
send_email("b@qq.com")
send_email("c@live.com")

【1】思路1
此方法繁琐:

# 写send_email1函数,让send_email1代指发邮件功能
def send_email1():
    # ### 1.邮件内容配置 ###
    # 邮件文本
    msg = MIMEText("你好", 'html', 'utf-8') 
    # 邮件上显示的发件人
    msg['From'] = formataddr(["张三", "zhangsan@163.com"])
    # 邮件上显示的主题
    msg['Subject'] = "邮件主题"
	
    # ### 2.发送邮件 ### 
    server = smtplib.SMTP_SSL("smtp.163.com")
    server.login("zhangsany@163.com", "JXTSQRBCBYVNNSUE")
    server.sendmail("zhangsan@163.com", "424662508@qq.com", msg.as_string())
    server.quit()
    
def send_email2():
    # ### 1.邮件内容配置 ###
    # 邮件文本
    msg = MIMEText("你好", 'html', 'utf-8') 
    # 邮件上显示的发件人
    msg['From'] = formataddr(["张三", "zhangsan@163.com"])
    # 邮件上显示的主题
    msg['Subject'] = "邮件主题"
	
    # ### 2.发送邮件 ### 
    server = smtplib.SMTP_SSL("smtp.163.com")
    server.login("zhagnsan@163.com", "JXTSQRBCBYVNNSUE")
    server.sendmail("zhangsany@126.com", "424662509@qq.com", msg.as_string())
    server.quit()

def send_email3():
    # ### 1.邮件内容配置 ###
    # 邮件文本
    msg = MIMEText("你好", 'html', 'utf-8') 
    # 邮件上显示的发件人
    msg['From'] = formataddr(["zhngsan", "zhangsan@126.com"])
    # 邮件上显示的主题
    msg['Subject'] = "邮件主题"
	
    # ### 2.发送邮件 ### 
    server = smtplib.SMTP_SSL("smtp.126.com")
    server.login("zhangsan@126.com", "JXTSQRBCBYVNNSUE")
    server.sendmail("zhangsan@163.com", "zhangsan@live.com", msg.as_string())
    server.quit()
    

send_email1()    #执行发邮件功能
send_email2()
send_email3()

【2】思路2,基于函数的参数(将代码中动态部分提取到参数位置,让函数可以充分被重用)

def send_email(email):  # 括号内为引入的参数,相当于一个变量
    # ### 1.邮件内容配置 ###
    # 邮件文本
    msg = MIMEText("你好", 'html', 'utf-8') 
    # 邮件上显示的发件人
    msg['From'] = formataddr(["张三", "zhangsan@163.com"])
    # 邮件上显示的主题
    msg['Subject'] = "邮件主题"
	
    # ### 2.发送邮件 ### 
    server = smtplib.SMTP_SSL("smtp.163.com")
    server.login("zhangsan@163.com", "WIYSAILOVUKPQGHY")
    server.sendmail("zhangsan@163.com", email, msg.as_string())
    server.quit()
    

v1 = "a@qq.com"
send_email(v1)

v2 = "b@qq.com"
send_email(v2)

v3 = "c@live.com"
send_email(v3)

1.参数

【1】形参【2】实参

在定义函数时,如果在括号中添加变量,我们称它为函数的形式参数,实际的参数为实参:

# ###### 定义有三个参数的函数(a1/a2/a3一般称为形式参数-形参) #####
def func(a1,a2,a3):
    print(a1+a2+a3)

# 执行函数并传入参数(执行函数传值时一般称为实际参数-实参)
func(11,22,33)   # 输出为66

# 执行函数并传入参数
func(9,2,103)   # 输出为114

【3】位置传参

执行函数的时候,参数会按照先后顺序,将形参与实参一一对应

 def add(n1,n2):
      print(n1+n2)
      
  add(1,22)

【4】关键字传参(位置和关键混合时,关键字传参要在后面)

执行函数并传入参数,使用此方法传参数,可以修改先后顺序。位置传参和关键字传参也可以混用。

  def add(n1,n2):
      print(n1+n2)
      
  add(n1=1,n2=22)
# ###### 定义有三个参数的函数(a1/a2/a3一般称为形式参数-形参) #####
def func(a1, a2, a3):
    print(a1 + a2 + a3)


# 执行函数并传入参数(执行函数传值时一般称为实际参数-实参)
func(11, 22, 33)

# 执行函数并传入参数
func(9, 2, 103)

# 执行函数
func(a1=99, a2=88, a3=1)
func(a1=99, a3=1, a2=88)

2. 默认参数

def func(a1, a2, a3=10):
    print(a1 + a2 + a3)


# 位置传参
func(8, 19)  # 上方有定义a3=10,在传参时可以不传a3,此时,a3默认为10
func(1, 2, 99)   #上方有定义a3=10,传参a3=99,此时,a3将不再等于10,为99

# 关键字传参(位置和关键混合时,关键字传参要在后面)
func(12, 9, a3=90)
func(12, a2=9, a3=90)
func(a1=12, a2=9, a3=90)
file_object = open("xxx.txt")

3. 动态参数

【1】*

def func(*args):    # args也可定义为x1之类的其他,但是一般情况下将*的动态参数默认定义为args,执行是此处可以传多个参数
    print(args) # 为*时,args默认会变成元组类型 ,传几个参数,args的元组中就会有几个元素
                

# 此函数只能按照位置传参
func(22)
func(22,33)
func(22,33,99)
func()   # 也可以不传参数,此时元组默认为空

# 输出:
(22,)
(22, 33)
(22, 33, 99)
()

【2】**

def func(**kwargs):  
    print(kwargs) # 默认为字典类型 
              
    
# 只能按关键字传参
func(n1="张三")
func(n1="张三",age=18)
func(n1="张三",age=18,email="xx@live.com")
func()

输出:
{'n1': '张三'}
{'n1': '张三', 'age': 18}
{'n1': '张三', 'age': 18, 'email': 'xx@live.com'}
{}    # # 也可以不传参数,此时字典默认为空

【3】*,**

通常不会单独使用* 或者**,而是按照如下使用方法,该方式既可以通过位置传参,也可以通过关键字传参

def func(*args,**kwargs):
    print(args,kwargs) 
    
# 输出:
(22,33,99) {}

func(22,33,99)
func(n1="张三",age=18)
func(22,33,99,n1="张三",age=18)
func()

# 输出:
(22, 33, 99) {}
() {'n1': '张三', 'age': 18}
(22, 33, 99) {'n1': '张三', 'age': 18}
() {}

提示:字符串格式化时的format功能参数处理机制与动态参数一致 :

v1 = "我叫{},今年{},性别{}".format("张三",18,"男")

v2 = "我叫{name},今年{age},性别{gender}".format(name="张三",age=18,gender="男")

注意事项(不重要,听过一遍即可)

# 1. ** 必须放在 * 的后面
def func1(*args, **kwargs):
    print(args, **kwargs)


# 2. 参数和动态参数混合时,动态参数只能放在最后。
def func2(a1, a2, a3, *args, **kwargs):
    print(a1, a2, a3, args, **kwargs)


# 3. 默认值参数和动态参数同时存在
def func3(a1, a2, a3, a4=10, *args, a5=20, **kwargs):
    print(a1, a2, a3, a4, a5, args, kwargs)


func3(11, 22, 33, 44, 55, 66, 77, a5=10, a10=123)

三、函数的返回值

在开发过程中,我们希望函数可以帮助我们实现某个功能,但让函数实现某功能之后有时也需要有一些结果需要反馈给我们,例如:

import requests
from xml.etree import ElementTree as ET


def xml_to_list(city):
    data_list = []
    url = "http://ws.webxml.com.cn//WebServices/WeatherWebService.asmx/getWeatherbyCityName?theCityName={}".format(city)
    res = requests.get(url=url)
    root = ET.XML(res.text)
    for node in root:
        data_list.append(node.text)
    return data_list


result = xml_to_list("北京")
print(result)
def func():
    return 666

res = func()
print(res) # 666
def magic(num):
    result = num + 1000
    return result

data = magic(9)
print(data) # 1009

在了解了返回值的基本使用之后,接下来在学3个关键知识:

1.返回值可以是任意类型,如果函数中没写return,则默认返回None

def func():
    return [1,True,(11,22,33)]

result = func()
print(result)
def func():
    value = 1 + 1
    
ret = func()
print(ret) # None

当在函数中未写返回值returnreturn None ,执行函数获取的返回值都是None。



```python
def func():
    value = 1 + 1
    return  # 或 return None

ret = func()
print(ret) # None

2.return后面的值如果有逗号,则默认会将返回值转换成元组再返回。

def func():
    return 1,2,3

value = func()
print(value) # (1,2,3)

3.函数一旦遇到return就会立即退出函数(终止函数中的所有代码)

def func():
    print(1)
    return "你好"
	print(2)
    
ret = func()
print(ret)
def func():
    print(1)
    for i in range(10):
        print(i)
        return 999
	print(2)
    
result = func()
print(result)

# 输出
1
0
999
def func():
    print(1)
    for i in range(10):
        print(i)
        for j in range(100):
            print(j)
	        return
	print(2)
    
result = func()
print(result)

# 输出
1
0
0
None

小结:

【1】完成某个结果并希望的到结果。

def send_email():
    ...
    return True

v1 = send_email()
def encrypt(old):
    ...
    return "密文..."

data = encrypt("武沛齐")
print(data)

【2】基于return控制让函数终止执行

def func(name):
    with open("xxx.txt",mode='r',encoding="utf-8") as file_object:
        for line in file_object:
            if name in line:
                return True
            
data = func("武沛齐")
if data:
    print("存在")
else:
    print("不存在")
def foo():
    while True:
        num = input("请输入数字(Q):")
        if num.upper() == "Q":
            return
        num = int(num)
        if num == 99:
            print("猜对了")
		else:
            print("猜错了,请继续!")
	print("....")

foo()

总结

  1. 函数的注释,说明函数的作用。
   def encrypt(origin):
       """ 用于数据加密和xxx """
   	pass
  1. 函数的返回值,一般用于将函数执行的返回给调用者。

    • 默认返回None
    • 遇到return则函数执行完毕

作业

  1. 请定义一个函数,用于计算一个字符串中字符a出现的次数并通过return返回。

    • 参数,字符串。
    • 返回值,字符串中 a 出现的次数。
def char_count(text):
    count = 0
    for char in text:
        if char == 'a':
            count += 1
    return count
result = char_count("89alskdjf;auqkaaafasdfiojqln")
print(result)
  1. 写函数,判断用户传入的一个值(字符串或列表或元组任意)长度是否大于5,并返回真假。
def judge_length(data):
    if len(data) > 5:
        return True
    return False
    
result = judge_length("张三王五李四")
print(result)
  1. 写函数,接收两个数字参数,返回比较大的那个数字(等于时返回两个中的任意一个都可以)。
def get_bigger(num1, num2):
    if num1 > num2:
        return num1
    return num2

result = get_bigger(11, 22)
print(result)
  1. 写函数,函数接收四个参数分别是:姓名,性别,年龄,学历,然后将这四个值通过"*"拼接起来并追加到一个student_msg.txt文件中。
def write_file(name, gender, age, degree):
    data_list = [name, gender, age, degree]
    data = "*".join(data_list)
    with open('student_msg.txt', mode='a', encoding='utf-8') as file_object:
        file_object.write(data)

write_file("张三", "男", "18", "博士")
  1. 补充代码,实现如下功能:

    • 【位置1】读取文件中的每一行数据,将包含特定关键的数据筛选出来,并以列表的形式返回。
    • 【位置1】文件不存在,则返回None
    • 【位置2】文件不存在,输出 “文件不存在”,否则循环输出匹配成功的每一行数据。
   def select_content(file_path,key):
       # 补充代码【位置1】
   
   result = select_content("files/xxx.txt","股票")
   # 补充代码【位置2】

完整代码:

import os


def select_content(file_path, key):
    # 补充代码【位置1】
    if not os.path.exists(file_path):
        return
    data_list = []
    with open(file_path, mode='r', encoding='utf-8') as file_object:
        for line in file_object:
            if key in line:
                data_list.append(line)
    return data_list


result = select_content("files/xxx.txt", "股票")
if result == None:
    print("文件不存在")
else:
    print(result)
  1. 补充代码,实现敏感词替换的功能。
   def change_string(origin):
       # 补充代码,将字符串origin中中的敏感词替换为 **,最后将替换好的值返回。 
       data_list = ["XXX", "aaa", "bbbb"]
       
   text = input("请输入内容:")
   result = change_string(text)
   print(result)

完整代码:

def change_string(origin):
    # 补充代码,将字符串origin中中的敏感词替换为 **,最后将替换好的值返回。
    data_list = ["XXX", "aaa", "bbbb"]
    for item in data_list:
        origin = origin.replace(item, "**")
    return origin


text = input("请输入内容:")
result = change_string(text)
print(result)
  1. 基于函数实现用户认证,要求:

    • 写函数,读取的用户信息并构造为字典(用户信息存放在files/user.xlsx文件中)
 # 构造的字典格式如下
 user_dict = {
     "用户名":"密码"
     ...
 }
  • 用户输入用户名和密码,进行校验。(且密码都是密文,所以,需要将用户输入的密码进行加密,然后再与Excel中的密文密码进行比较)
 import hashlib
 
 def encrypt(origin):
     origin_bytes = origin.encode('utf-8')
     md5_object = hashlib.md5()
     md5_object.update(origin_bytes)
     return md5_object.hexdigest()
 
 
 p1 = encrypt('admin')
 print(p1) # "21232f297a57a5a743894a0e4a801fc3"
 
 p2 = encrypt('123123')
 print(p2) # "4297f44b13955235245b2497399d7a93"
 
 p3 = encrypt('123456')
 print(p3) # "e10adc3949ba59abbe56e057f20f883e"

扩展:密码都不是明文。

  • 注册京东,京东存储:用户名和密码(密文)
  • 登录京东:用户名& 密码。
import hashlib
from openpyxl import load_workbook


def get_user_dict():
    user_dict = {}
    wb = load_workbook("files/user.xlsx")
    sheet = wb.worksheets[0]
    for row in sheet.rows:
        user_dict[row[1].value] = row[2].value
    return user_dict


def encrypt(origin):
    origin_bytes = origin.encode('utf-8')
    md5_object = hashlib.md5()
    md5_object.update(origin_bytes)
    return md5_object.hexdigest()


user = input("请输入用户名:")
pwd = input("请输入密码:")

encrypt_password = encrypt(pwd)

user_dict = get_user_dict()

db_password = user_dict.get(user)

if encrypt_password == db_password:
    print("登录成功")
else:
    print("登录失败")

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

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

相关文章

uniApp之同步资源失败,未得到同步资源的授权,请停止运行后重新运行,并注意手机上的授权提示、adb、shell、package、uninstall

文章目录 背景解决思路执行查找第三方应用的指令执行卸载指令 背景 一开始正常编译运行,由于应用页面有些许奇怪的错误,便想着卸载,重新运行安装调试基座。卸载后,运行还是会出现,明明已经把应用卸载了,还是…

C++在线五子棋对战(网页版)项目:实用工具类模块代码实现

在线五子棋项目中需要用到的实用工具模块: 1.日志宏:实现程序日志打印 2.mysql_util:数据库的连接和初始化,句柄的消耗,语句的执行 3.json_util:封装实现json的序列化和反序列化 4.string_util:封装实现字符…

Clion开发STM32之W5500系列(四)

W5500协议层之DHCP功能 头文件 #ifndef STM32_VET6_W5500_DHCP_H #define STM32_VET6_W5500_DHCP_H#include "socket.h"#define DEVICE_ID "w5500" #define IP_CONFLICT_STR "CHECK_IP_CONFLICT" #define DHCP_FLAGSBROADCAST 0x8000 /* …

π141E30S 200Mbps四通道数字隔离器兼容代替NSi8141S0

π141E30S荣湃深力科 200Mbps四通道数字隔离器兼容代替NSi8141S0 π141E30S数字隔离器具有出色的性能特 征和可靠性,整体性能优于光耦和基于其他原理的数字隔离器。 在不需要调制和解调的情况下,实现电压信号跨越隔离介质精 准传输。 π141E30S传输通道…

利用ffmpeg使用脚本+excel批量合成视频

起因是忘了是什么时候,下载的视频是被切割的一个一个的,所以网上找了方法,利用ffmpeg批量进行了批量合成,这里记录一下,并用gpt解释一下脚本含义。 1、文件名批量转mp4格式 如果文件名不规范,可以利用exce…

spark Structured Streaming checkpoint参数优化

目录 1 问题描述2 分析 checkpointLocation 配置 2.1 checkpointLocation 在源码调用链2.2 MetadataLog(元数据日志接口)3 分析 checkpointLocation 目录内容 3.1 offsets 目录3.2 commitLog 目录3.3 metadata 目录3.4 sources 目录3.5 sinks 目录4 解决…

跨站脚本攻击XSS

​​​​​​1、漏洞原理及防御 XSS又叫CSS (CrossSiteScript),因为与层叠样式表(css)重名,所以叫Xss,中文名叫跨站脚本攻击。 xss攻击,主要就是攻击者通过“html注入”篡改了网页,插入了恶意的脚本,从而在用户浏览网页时&#…

迅为龙芯3A5000_7A2000COMe_模块和主板

龙芯 3A50007A2000 COME 采用全国产龙芯 3A5000 处理器,基于龙芯自主指令系统 (LoongArche)的 LA464 微结构,并进一步提升频率,降低功耗,优化性能。桥片采用龙芯 7A2000,支持 PCIE 3.0、USB 3.0 和 SATA 3.0、显示接口…

单独编译 Android 固件-打包 update.img-iTOP-RK3588开发板

进入到 3588-android12 文件夹,输入以下命令设置 java 版本为 1.8 版本,如下图所示: source javaenv.sh java -version 输入以下命令使能编译环境: source build/envsetup.sh lunch rk3588_s-userdebug 执行完上述命令,如果需要编译 uboo…

如何破解滑动验证码?

本文通过自动化查询域名或公司的备案信息,来演示其中图片滑动验证码的破解方式,以此来思考验证码的安全性问题,思考如何设计出安全性更高的验证码。 注意:破解验证码进行网络内容抓取可能是一种违规行为,可以以此进行验…

西门子PLC硬件编程需要注意的几个要点

往往一个好的编程程序习惯可以让事情事半功倍。用正确的逻辑思维和方法去写程序,一方面可以减少出错,另一方面就是方便检查程序里出现的bug。下面就为大家盘点一下,西门子PLC的一些硬件编程的好习惯。 1、关于选型 项目开始需要统计出IO点表…

Linux嵌入式项目-智能家居

一、资料下载 二、框架知识 三、MQTT通信协议 1、上位机APP主要工作 1.wait for msg / while(1)订阅等待消息 2.处理消息 客户端创建了两个线程,一个线程用于发布消息,一个线程用于监听订阅消息 (那我的仿真系统也可以啊,一个…

《AutoSar实战》DIO配置

文章目录 前言一、配置过程1,选择引脚2,DIO模块配置1)新建DioChannel 3,PORT模块配置4,保存并生成DIO,PORT模块 二、实现并验证1,调用函数接口2,示波器测量周期 总结 ->返回总目录…

富士施乐/Fuji Xerox SC2022 CPS DA 彩色激光复印机不能扫描的解决方法

一台富士施乐/Fuji Xerox SC2022 CPS DA 彩色激光复印机用网线连接的,有分配的IP地址,有三台电脑连接,可打印,但是不能扫描。 驱动也没问题,找了一台电脑先删除了打印机,在官网下载了驱动重新安装&#xff…

【Spring学习一】简单认识Spring是什么?——框架

目录 1、为什么要学习Spring? 2、Spring是什么? 1、IoC是什么? 2、进一步通过代码演示理解IoC 3、怎么理解容器? 4、知道DI与IoC的区别? 1、为什么要学习Spring? 我们常说的Spring 指的是 Spring Fra…

Microsoft 已经发布了7月份的产品安全问题修复报告。

🔥Microsoft 已经发布了7月份的产品安全问题修复报告。我们建议您关注趋势性漏洞,即那些已经或即将被攻击者积极利用的漏洞。 7月份报告中的两个危险漏洞: CVE-2023-32049和CVE-2023-35311。 CVE-2023-32049漏洞允许网络犯罪分子绕过Window…

卫星图片的Classification_model

Tensorflow版本:2.6.0 使用的是CNN神经网络,网络结构在最后给出 飞机和湖泊的卫星图片二分类网络 数据集请点击链接:https://www.kaggle.com/datasets/yo7oyo/lake-plane-binaryclass 数据集的构成:airplane: 700 张, …

着眼未来砥砺前行,知了汇智携西南交大学生走进企业参观学习

随着数字化转型推进的深入,企业对数字化人才的需求量大幅增长,人才需求结构也发生显著在变化。为加强学生与企业的接触,拓展专业视野,对接行业需求,激发学生对所学专业的兴趣,明确自己学习的目标&#xff0…

NC19 连续子数组的最大和

import java.util.*; public class Solution {public int FindGreatestSumOfSubArray(int[] array) {//记录到下标i为止的最大连续子数组和int[] dp new int[array.length]; dp[0] array[0];int maxsum dp[0];for(int i 1; i < array.length; i){//状态转移&#xff1a;…

优雅实现垂直SeekBar:不继承Seekbar、不自定义View

目录 0 前言 关于自定义View 1 实现竖直SeekBar 1.1 XML布局解析 1.1.1 套一层FrameLayout 1.1.2 SeekBar去除左右间距 1.1.3 SeekBar高度无法设置 1.1.4 SeekBar背景设置 1.1.5 底部View尺寸和距底部距离不硬编码 1.2 自定义样式属性与主题 1.2.1 自定义样式属性 …