科普 python 注释 #

为什么几乎就 python 中的注释是 # ?

  • 起初 python 在 linux 中用的最多,linux 中大量的配置、shell 脚本等都是 # 作为注释的,所以 python 的注释也就沿用了 #

代码几乎都要写在 main 函数里执行(本文写的都是伪代码)

本文仅是跟着视频学习做的笔记,并未花时间去校对,如有错误,别太当真

重复定义是错误的,我的代码里有很多重复定义,只是为了写出来,你 copy 过去用的时候记得把重复定义删掉

函数高级

内层函数:定义在函数内部的函数

闭包函数:定义在函数内部,对外部作用域有引用(闭包函数本质也是内层函数)

  • go 中函数内部定义的函数是不能有名的,需要定义匿名函数:没有名字

在 go 语言中没有像 python 中的装饰器语法糖,但可以自己实现类似功能

// 内层函数
func test(a int) (func()) {
// var c int = 100
b := func() {
fmt.println("我是内层函数(定义在了函数内部,但没有引用外部作用域)")
}
} // 闭包函数
func test(a int) (func()) {
// var c int = 100
b := func() {
fmt.println(a) // 是闭包函数,本身也是内层函数
}
} // 模仿 python 装饰器的写法
// 定义一个函数,传入函数,返回函数
func test(a func()) func() {
b:= func() {
fmt.Println("我先执行")
a()
fmt.Println("函数执行完了")
}
return b
} func test2() {
fmt.Println("xxxx")
} func main() {
a := test2
a = test(a)
a()
//我先执行
//xxxx
//函数执行完了
}

给类型取别名 type MyFunc func(a, b int) func()

取了别名之后,用了别名的变量和原来的类型不是同一个类型了

// 给类型命别名
func main() {
type MyInt int
var a MyInt = 10
var b int = 90
// a = b // 会报错,类型不匹配
a = MyInt(b) // 强转成一个类型
fmt.Println(a)
// 90
} // 用在函数上面来简化写法
type MyFunc func(a int,b int) func() type MyInt int
func test() (MyFunc) {
c:= func(a int,b int) func(){
return func() { }
}
return c
}
func main() {
var a MyInt=10
var b int =90
a=MyInt(b)
fmt.Println(a)
// 90
}

if else if else

跟 js 的写法差不多

  • if 条件 { 三个之间不能有换行(所有语言每一句结束都应该有一个 ;,很多语言都做了封装),如果加了换行,go 会自动在条件后面加上 ;,那么语义就错了

  • 在条件中可以定义变量,但是它的作用域范围只在 if 判断内部使用

package main

import "fmt"

func main() {
if a := 90; a > 90 {
fmt.Println("a>90")
} else if a > 70 {
fmt.Println("a>70")
} else {
fmt.Println(a)
}
}
//a>70

包管理

go 的包管理一直被人所诟病(go 还是一门比较年轻的语言,需要时间来成长)

1)通常情况下,包名就是文件夹,在同一个文件夹下的 go 文件,文件里的包名必须一致

2)同一个包下定义的东西(变量、常量、函数)不能重名

  • 下面的两个文件同在 mypackage 包下(里面写的 package),所以第二次写 test 函数时,goland 编辑器就直接报错了

3)在包内定义的函数如果是小写字母开头,表示只能在包内使用(外部无法引用)

  • 要想在外部使用,必须首字母大写(函数定义的时候)

    package main
    import "fmt"
    import "mypackage" func main() {
    mypackage.Test1()
    fmt.Println("xxx")
    }

4)go 里导包只能导到包名那一层,不能说导里面的方法属性这些(import 包名

5)所有的包都必须在 gopath 路径下的 src 文件夹下

  • 目前 go 的包管理还不是很成熟,如果依赖了第三方包的不同版本,会不能兼容(只能有一个版本)

    如果非要兼容两个版本,开发的时候可以暂时先把 gopath 改一下,这样就可以放另一个版本了

Go 语言架构

GOPATH 的工作区包含 bin、src 和 pkg(没有这三个文件夹时需要自己创建)

  • src ------- 源码(包含第三方的和自己项目的)
  • bin ------- 编译生成的可执行程序
  • pkg ------ 编译时生成的对象文件

下载第三方包

go 是一个开源的社区语言,所以并没有 python 那样一个专门的 pipy 来下载模块镜像,都是去各个地方下载

go get github.com/astaxie/beego(地址)

比较热门的框架

  • beego 是中国人写的,所以官网文档也是中文的
  • gin 是外国人写的

go 的优点之一

  • go 写小接口很快,也很简单,部署也非常方便(微服务可能比 flask 写起来还要快)

可以了解一下 Supervisord(beego 官网文档里有)

  • 是一个用python写的进程管理工具
  • 由于 beego 的作者之一是 Python 的忠实拥护者之一,所以 orm 设计沿用了 django 的 orm

for 循环

for 循环的几种写法

// 不能重复定义,这里面的代码只是案例
package main import "fmt" func main() {
// 基础写法
for i := 0; i < 10; i++ {
fmt.Println(i)
} // 三部分都可以省略
i := 0
for ; i < 10; i++ {
fmt.Println(i)
} i := 0
// for ;i<10; { // 或
for i < 10 { // 等同于 python 里的 while 循环 --> while True ==》 for True
fmt.Println(i)
i++
} // 死循环
// for ;; { // 或
for {
fmt.Println("xxx")
} // 注意下作用域范围(循环里定义的变量只能在循环里用) // --------中断或跳过本次循环--------
// 用的是 break 和 continue,和其他语言的用法是一样的 for i := 0; i < 10; i++ {
if i == 5 {
break
}
fmt.Println(i)
}
for i := 0; i < 10; i++ {
if i == 5 {
continue
}
fmt.Println(i)
} }

switch 语句

package main

import "fmt"

func main() {
//a := 10
//switch a {
//case 1:
// fmt.Println("1")
//case 2, 3, 4:
// fmt.Println("2-4")
// fallthrough // 只要读到这个,会无条件执行下面一个 case 内容
//case 5:
// fmt.Println("5,a 是 2-4时顺带执行我")
//default: // 都不匹配,会执行这个
// fmt.Println("都不是")
//}
////都不是 // 无表达式的 switch
a := 10
switch {
case a > 10:
fmt.Println("a大于10")
case a < 10:
fmt.Println("a小于10")
default:
fmt.Println("a等于10")
}
// a等于10
}

数组及数组切片

  • 数组是同一类型元素的集合
  • 在定义阶段,长度和类型就固定了,以后不能更改(这和 python 的列表有很大的区别)
  • 数组不支持负数索引
// 不能重复定义,这里面的代码只是案例
package main
import "fmt" func main() {
var a [5] int // 定义了一个长度为5的 int 类型数组
fmt.Println(a)
// [0 0 0 0 0] a[1] = 100 // 索引是从 0 开始的
fmt.Println(a)
// [0 100 0 0 0] // 定义并赋初值
var a [6]int = [6]int{1,2,3,4,5,6}
var a = [6]int{1,2,3} // int 类型省略的几个自动用 0 填充 a := [100]int{98:99} // 把第99个(索引是98)设置成99
a := [100]int{1,2,3,98:99,87:88}
// 不支持负数索引 var a = [...]int{} // 不是数组不定长
fmt.Println(a)
// [] var a = [...]int{1,2,4}
fmt.Println(a)
// [1 2 4] }
  • 数组是值类型,所有函数传参都是 copy 传递(即 python 中的不可变类型)
package main
import "fmt" func main() {
a := [4]int{1,2,3}
test7(a)
fmt.Println(a)
} func test7(b [4]int) {
b[0]=100
fmt.Println(b)
} // [100 2 3 0]
// [1 2 3 0]

go 1.5版本之前都是用C写的,但后面就开始用go语言写了

  • 数组的大小也是类型的一部分
// a 和 b 不是同一个类型
var a [4]int
var b [5]int
// 不同类型无法直接赋值,也无法直接做大小比较

数组迭代

package main
import "fmt" func main() {
var a [4]int = [4]int{1,2,}
for i:=0;i<len(a);i++{ // len 可以获取数组长度
fmt.Println(a[i])
}
//1
//2
//0
//0 // 通过 range 迭代(range是一个关键字)
for i, v := range a { // for 索引,值 range 可迭代对象
fmt.Println("-----", i) // 索引
fmt.Println(v) // 值
}
//----- 0
//1
//----- 1
//2
//----- 2
//0
//----- 3
//0 for i := range a { // 一个值就是索引
fmt.Println("-----", i)
}
//----- 0
//----- 1
//----- 2
//----- 3
}

多维数组

package main
import "fmt" func main() {
var a [7][2]int
fmt.Println(a)
// [[0 0] [0 0] [0 0] [0 0] [0 0] [0 0] [0 0]] a[0][1]=100
fmt.Println(a)
// [[0 100] [0 0] [0 0] [0 0] [0 0] [0 0] [0 0]]]
}

与或非 && || !

package main
import "fmt"
func main() {
a := 13
if !(a < 1 && a > 0 || a == 6) {
fmt.Println("success.")
// success.
}
}

作业

  1. 写一个闭包函数
  2. 定义一个包,内部写一个test函数,只给包内部用,写一个Test1函数,给外部包用,在main包内调用
  3. 使用go语言打印99乘法表
  4. 定义一个长度为100的数组,初始化前5个值都为8,第66个值为66
  5. 通过两种方式循环打印出上面的数组
  6. 将上面的数组的数据倒序放在另一个100长的数组中

Go-函数高级使用-条件分支-包管理-for循环-switch语句-数组及切片-与或非逻辑符的更多相关文章

  1. go语言学习——变量、常量、循环、条件、switch、数组和切片

    1.变量 package main import "fmt" func main() { 个或者多个变量. var a string = "initial" f ...

  2. 包、mode模式、if-else语句、switch语句

    目录 包 mode模式 if-else语句 循环 switch语句 包 //1 在同一个包下(文件夹下),包名必须一致 //2 以后,包名就是文件夹的名字 //3 同一个包下,同名函数只能有一个(in ...

  3. 你好,C++(20).4.2.2 表达并列条件选择的switch语句:如果……如果……如果……

    4.2.2  表达并列条件选择的switch语句:如果……如果……如果…… 在现实世界中,还有这样一类特殊的条件选择: 如果明天是晴天,我就穿T恤: 如果明天是阴天,我就穿衬衣: 如果明天是雨天,我就 ...

  4. Linux centosVMware 自动化运维Ansible介绍、Ansible安装、远程执行命令、拷贝文件或者目录、远程执行脚本、管理任务计划、安装rpm包/管理服务、 playbook的使用、 playbook中的循环、 playbook中的条件判断、 playbook中的handlers、playbook实战-nginx安装、管理配置文件

    一.Ansible介绍 不需要安装客户端,通过sshd去通信 基于模块工作,模块可以由任何语言开发 不仅支持命令行使用模块,也支持编写yaml格式的playbook,易于编写和阅读 安装十分简单,ce ...

  5. git npm包管理

    #Node # node 一.安装nodejs 下载地址:http://nodejs.cn/download/ 二.安装git 下载地址:https://git-scm.com/download/wi ...

  6. 1、Golang基础--Go简介、环境搭建、变量、常量与iota、函数与函数高级

    1 Go语言介绍 1 golang-->Go--->谷歌公司 2009年 golang:指go语言,指的go的sdk goland:软件,ide:集成开发环境 Java写的 2 Go是静态 ...

  7. Helm包管理

    Helm Kubernetes 包管理工具 Helm 可以帮助我们管理 Kubernetes 应用程序 - Helm Charts 可以定义.安装和升级复杂的 Kubernetes 应用程序,Char ...

  8. Python 包管理工具解惑

    Python 包管理工具解惑 本文链接:http://zengrong.net/post/2169.htm python packaging 一.困惑 作为一个 Python 初学者,我在包管理上感到 ...

  9. Swift 正式开源, 包括 Swift 核心库和包管理器

    Swift 正式开源!Swift 团队很高兴宣布 Swift 开始开源新篇章.自从苹果发布 Swfit 编程语言,就成为了历史上发展最快的编程语言之一.Swift 通过设计使得软件编写更加快速更加安全 ...

随机推荐

  1. Raspberry Pi 4B Web服务器配置

    目录 1. 安装nginx 2. 安装PHP 3. 修改nginx配置文件 4. 安装MariaDB数据库 参考资料1:树莓派4B安装PHP7.3 + Nginx + MySQL 教程 参考资料2:[ ...

  2. mysql.zip版本的安装教程

    MySQL zip版本安装 一直以来都习惯了使用MySQL安装文件(.exe),今天下载了一个.zip版本的MySQL,安装过程中遇到了一些问题,如下: 1.在MySQL官网上(http://dev. ...

  3. 史上最详细的C语言和Python的选择排序算法

    未经同意,请勿转载!如有收货,请留一赞,不胜感激! 同时欢迎加入我们的qq交流群:326079727 话不多说上代码: C语言: //选择排序走起 //原理:吃透原理再去实现,选择排序也是类似于冒泡排 ...

  4. Java同步数据结构之ConcurrentLinkedQueue

    前言 前面介绍的Queue都是通过Lock锁实现的阻塞队列,今天介绍一种非阻塞队列ConcurrentLinkedQueue,所谓非阻塞,其实就是通过CAS代替加锁来实现的高效的非阻塞队列.当许多线程 ...

  5. 阶段5 3.微服务项目【学成在线】_day05 消息中间件RabbitMQ_16.RabbitMQ研究-与springboot整合-生产者代码

    springBoot给我们提供了 RarbbitTemplate发送消息 创建测试类,因为我们是基于SpringBoot的来写的测试类.所以要加上@SpringBootTest和@RunWith的注解 ...

  6. 阶段5 3.微服务项目【学成在线】_day03 CMS页面管理开发_16-异常处理-可预知异常处理-自定义异常类型和抛出类

    在common工程创建捕获异常的类:CustomException Runtime叫做运行异常.在代码中抛出的话 对我们的代码没有可侵入性 如果在代码上抛出 如果改成Exception 这时候就会有错 ...

  7. log4net通过代码控制按分类输出

    应用场景: 比如我们系统有5个任务,每个任务都是独立的流程,按照传统的方式这些流程的数据会输出到一起,这无疑给我们排查问题增加了难度,因为我们需要的是每一个任务一个独立的输出文件,比如任务A输出到lo ...

  8. 用alert打印js对象

    用alert查看对象: function writeObj(obj){ var description = ""; for(var i in obj){ var property= ...

  9. CockroachDB学习笔记——[译]Cgo的成本与复杂性

    原文链接:https://www.cockroachlabs.com/blog/the-cost-and-complexity-of-cgo/ 原作者:Tobias Schottdorf 原文日期:D ...

  10. Unity3d 烘培lightingmap 注意的2点.

    1.在Qulity里面设置合适的灯光数量.否则,你会发现烘培出来的场景,有些灯光没有起作用. 2.在导入模型时候,注意勾选:Generate Lightingmap .  否则,模型没办法烘培. 3. ...